web-dev-qa-db-ja.com

ユーザー向けのクラウドベースの秘密鍵ストレージ

クラウドベースの秘密鍵ストレージをユーザー用に作成したいとします。これを使用してドキュメントに署名

サーバー側では、[〜#〜] hsm [〜#〜]を使用して、キーストレージをより安全にします。

1つのオプションは、署名がサーバー側で行われることです。しかし、このようにして、サーバーはユーザーの秘密鍵を認識します。これは私が望んでいることではありません。

もう1つのオプションは、ユーザーの秘密鍵を対称鍵(たとえば、[〜#〜] aes [〜#〜])でラップし、ユーザーだけが知っているようにして、それを保存することです。 [〜#〜] hsm [〜#〜]

この[〜#〜] aes [〜#〜]キーは、ユーザーのパスワードから取得されます。パスワードからキーを作成するためのPBKDF2のようなメカニズムがあります。

次に、ユーザーがドキュメントへの署名を要求すると、サーバーは、そのユーザーだけが知っている[〜#〜] aes [〜#〜]キーで暗号化されたユーザーの秘密キーを送信します。 。

クライアント側(Androidアプリ、またはjavascriptに基づくwebapp)を使用して署名を作成します。

また、次のように機能するパスワード変更メカニズムが必要になります。

  • クライアントはサーバーに秘密鍵を要求します(AES鍵で暗号化されています)
  • クライアントは、自分のパスワードから派生したAESキーを使用して秘密キーを復号化します
  • クライアントは、新しいパスワードを使用して新しいキーを生成します
  • クライアントは自分の秘密鍵を自分のAES鍵で暗号化し、サーバーに送信します
  • サーバーは、ラップされたユーザーの秘密鍵を新しいもので更新します

[〜#〜] hsm [〜#〜]モジュールについてはよくわかりませんが、理解しているように、スマートカードと同様の機能を備えています(キーは[〜#〜] hsm [〜#〜]を離れないでください。すべての暗号化が行われるはずです)。

キー生成時にPKCS#11 "CKA_EXTRACTABLE"が設定されている場合、一部のHSMでキー抽出が許可されることをどこかで読みました。しかし、それは、ほとんどの場合、[〜#〜] hsm [〜#〜]の唯一の目的を打ち負かすことではないでしょうか。

また、[〜#〜] hsm [〜#〜]を使用するときに説明したパスワード変更のメカニズムを実装できますか?

別のオプションは、署名が[〜#〜] hsm [〜#〜]で行われ、秘密鍵が[でラップされることです。 〜#〜] aes [〜#〜]キー、ユーザーのパスワードから生成されます。 [〜#〜] hsm [〜#〜]は、秘密鍵をアンラップしてファイルに署名しますが、クラウドプロバイダーは秘密鍵自体にアクセスできません。

この場合、私が説明したパスワード変更メカニズムを実装することは可能でしょうか?

また、パスワードベースの鍵導出メカニズムは、saltを使用して、レインボーテーブル攻撃をより困難にします。

この場合、塩はどのように使用されますか?サービスを使用するときに、サーバーに保存してからクライアントに転送しますか?

要件は、ユーザーが自分のユーザー名/パスワードを知っているだけで、任意のデバイス(モバイル、デスクトップ)でサービスを使用できることです。

サーバーへの認証時に[〜#〜] sms [〜#〜]検証を追加することで、おそらく2FAを含めます。

1
user3362334

あなたのスキームは実行可能ですが、HSMのポイントを完全に打ち負かします。プレーンなデータベースストレージでもそれを行うことができます。

HSM(実際には巨大で非常に高速なスマートカードにすぎません)のポイントは、管理者を含む誰もがキーマテリアルを抽出できなくても、キーマテリアルを安全に保存(プライベート)できることです。

1
mat