ユーザーのデータを開発者でも見れないようにする方法
😃 ユーザーのデータを、開発者にも見れないようにする方法ってあるの?
🐹 どんなデータ?
😃 パスワードとか、ユーザーが作ったコンテンツとか
パスワードの場合
🐹 パスワードの場合はまず、平文保存は絶対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 リポジトリのコードそのものであり、かつ設計的に運営もデータを見られません」まで言える
😃 信頼性ばつぐんだね
🐹 そうだね