Noesworthy

ユーザーのデータを開発者でも見れないようにする方法

😃 ユーザーのデータを、開発者にも見れないようにする方法ってあるの?

🐹 どんなデータ?

😃 パスワードとか、ユーザーが作ったコンテンツとか

パスワードの場合

🐹 パスワードの場合はまず、平文保存は絶対NGで、

🐹 ハッシュ化して不可逆保存するのが鉄板

🐹 アルゴリズムはbcrypt, scrypt, Argon2 のどれか(古い MD5, SHA1 はダメ🙅)

🐹 同じパスワードでも違うハッシュになるようにランダムソルトを入れる

🐹 複合できないけど、そもそも複合する必要はないから、これでOK(ユーザーがパスワードなくしたら再発行させる)

ユーザーが作ったコンテンツの場合

🐹 ここは少し工夫が必要だよ

A. E2EE方式(最も強い)

🐹 ユーザー端末で暗号化して送信する

🐹 鍵はユーザーのみ保持

🐹 サーバーは「暗号文しか保存できない」

🐹 開発者はもちろん復号できない

🐹 デメリット: サーバー側で検索・おすすめ機能が難しくなる

B. サーバー暗号化 + KMS/HSM

🐹 データはサーバーで暗号化して保存

🐹 鍵はクラウドKMS(Google Cloud KMS, AWS KMSなど)が管理

🐹 開発者はDBを直接覗いても平文を見れない

🐹 復号処理はアプリ経由のみ

🐹 デメリット: 理論上は「運営権限」で復号可能

C. TEE(Trusted Execution Environment)

🐹 Intel SGXやAWS Nitro Enclavesなどの「信頼できる実行環境」で処理

🐹 運営者・管理者でも実行中の平文は見えない

🐹 デメリット: 開発・運用が難しい

代表的なサービス

😃 コンテンツを暗号化してるサービスってどんなのがあるの?

🐹 WhatsApp(E2EE)、Telegram (Secret ChatがE2EE)、Bitwarden(マスターパスワードはハッシュ化、ユーザーデータはAES-256で暗号化)とか

😃 ユーザーのコンテンツを運営にも読めなくしてるサービスってあんまり多くないんだね

🐹 うん、Notion とか Slack とか一般的なSaaSは「パスワードはハッシュ化してるけど、ユーザーデータは運営が読める形で暗号化(KMS)」って感じ

ゼロ知識設計

🐹 こういうの、「ゼロ知識設計(Zero-Knowledge Architecture / Zero-Knowledge Proof system)」っていうんだよね

🐹 データは常に暗号化された状態で保存される

🐹 暗号鍵はユーザーだけが持つ(運営は知らない)

🐹 運営側のDBやサーバーを全部覗いても「暗号文」しか見えない

🐹 つまり「開発者を信じなくても安全」っていう仕組み

😃 これをOSSでやったらお客さんにとってフェアな気がする

🐹 そう、ゼロ知識とOSSを組み合わせれば、セキュリティ設計を「信じてね」じゃなくて「仕組み的にできません」にできる

😃 SALSA認証と組み合わせれば、Prodに上がってるのは実際のmasterブランチのコードですよって言えて、さらに信頼性が増すね

🐹 そうだね、SALSA認証(ソフトウェアサプライチェーンセキュリティ保証)を使えば「私たちが動かしているサービスは、公開されているこの OSS リポジトリのコードそのものであり、かつ設計的に運営もデータを見られません」まで言える

😃 信頼性ばつぐんだね

🐹 そうだね

#tech