web-dev-qa-db-ja.com

チャットメッセージをFirebaseに保存する前に暗号化する必要はありますか?

私の知る限り、FirebaseはHTTPS接続を介してデータを送信するため、データはすでに暗号化されています。 Firebaseにはデータ構造を保護するためのセキュリティルールが用意されていますが、データベースで文字列メッセージを表示することはできます。

データをFirebaseにpushする前にメッセージを暗号化するのが良いアイデアかどうかだけに興味があります。このトピックから他のトピックに移る必要がありますか?

ありがとうございました。

13
JeffMinsungKim

Firebase Databaseのしくみをよく理解しているようです。 データは転送中に暗号化されます 、そして サーバーの暗号化されたディスクに保存されています です。デバイスでローカル永続性を有効にすると、 デバイス上のデータは暗号化されません

ただし、アプリの管理者は、Firebaseコンソールでデータを表示できます。管理者がこのデータを読み取れないことがアプリの要件である場合は、Firebaseに送信する前にクライアントで暗号化する必要があります。少し前に、開発者が firebase-talkメーリングリストのエンドツーエンドの暗号化チャット について説明しました。

14

ヘイジェフ:Firebase/Firestoreにデータを書き込むと、データは次のようになります。

  1. HTTPSを使用してネットワーク経由で保護されています。
  2. 次に、Firebase RESTフロントエンドサーバーに到達すると、HTTPSが終了し、サーバーは完全なペイロードにアクセスできます
  3. 次に、RESTサーバーがデータをバックエンド/データベースにルーティングします。バックエンド/データベースもデータにアクセスできます。
  4. データがディスクに書き込まれると、データは保存時に暗号化されますが、保存時に暗号化キーもGoogleで利用でき、管理者にはFirestoreのコンテンツも表示されます

データをクライアント側で暗号化(エンドツーエンド暗号化)すると、これらの参加者/ロールすべてがデータを見ることが禁止されます。

クライアント側でのデータの暗号化はかなり単純です(モバイルプラットフォームとブラウザー間の互換性は扱いにくいです)。もう1つのトリッキーな部分は、1人のユーザーが安全でないチャネルでキーを送信せずに復号化キーにアクセスできるようにするキー管理です。

これを実装する方法は次のとおりです。

  1. ユーザーがサインアップするときに、ユーザーの秘密鍵と公開鍵を作成します
  2. User1のデバイス上のデータをuser2の公開鍵で暗号化する
  3. 暗号化されたデータをFirestoreに書き込む
  4. User2が暗号化されたデータを読み取ると、彼女の秘密鍵でデータを復号化できます。

IOS向けGitHubでこのFirebase E2EEチャットサンプルを確認してください: https://github.com/VirgilSecurity/demo-firebase-ios およびAndroid: https://github.com/VirgilSecurity/demo-firebase-Android

HTH、デビッド

6
David Szabo