web-dev-qa-db-ja.com

Firebaseでユーザーデータを暗号化する方法

Firebaseで電子メール/パスワードサインイン方式を使用しています。データベースに送信する前に、ユーザーがリアルタイムデータベースに保存するデータを暗号化します。 Firebaseはすでにユーザーパスワードを処理していますが、クライアントだけでは解読できないデータを暗号化するために何らかの方法で使用できますか?クライアントSDKで実現できたらいいですね。

したがって、私のフローは次のようになります。

  1. ユーザーはその資格情報でサインインします(これはfirebase自体によって処理されます)
  2. ユーザーはいくつかの一意のキーでデータを暗号化します。このキーは、資格情報またはユーザーのみが利用できるが私は利用できないデータからのみ生成できます。 (このキーは、セッション間、またはユーザーがパスワードを変更した後も持続する必要があります。)
  3. データはデータベースに保存されます(ユーザーの資格情報で暗号化されているため、読み込めません)
  4. ユーザーは別のデバイスにログインします(復号化キーはすぐに生成でき、データは復号化できます)。
23
NoNameProvided

次の方法で簡単に実行できます。

  1. ユーザーAがログインすると、ランダムな公開秘密キーペアが電話で生成されます。例:Ecc Curve25519を使用
  2. Aからの秘密鍵は彼の電話に安全に保存されます
  3. Aからの公開鍵はfirebaseに保存されており、Aとチャットする誰でもアクセスできます。
  4. XがAにメッセージを送信する場合、彼はfirebaseからAから公開キーを取得し、Aのメッセージをローカルで暗号化し、暗号化されたメッセージをfirebaseのAからinboxに保存します
  5. 暗号化されたメッセージをfirebaseからダウンロードし、携帯電話に保存されている秘密鍵で解読します

(AからXの場合は逆)

Aが別の電話に移動したい場合、または複数の電話を使用したい場合は、次のようにします。

  1. Aに、ローカルに保存された秘密キーを暗号化するための強力なパスワードを定義するよう依頼します。 (または、ランダムパスフレーズを作成し、キー交換にQRコードを使用します)
  2. ステップ1のパスワードを使用して、自分の電話で秘密鍵をローカルで暗号化(例:AES256を使用)し、それをfirebaseにアップロードします。 (オプションで彼の秘密鍵で署名します)
  3. Aから2番目のデバイスから暗号化された秘密キーをダウンロードします
  4. Aから2番目のデバイスでパスフレーズを要求し、秘密キーを安全に保存します(オプションでAからの公開キーで署名を確認します)
  5. バックアップが必要ない場合は、Firebaseから暗号化された秘密キーを削除します
20
Hollerweger