クラウドベースの秘密鍵ストレージをユーザー用に作成したいとします。これを使用してドキュメントに署名。
サーバー側では、[〜#〜] hsm [〜#〜]を使用して、キーストレージをより安全にします。
1つのオプションは、署名がサーバー側で行われることです。しかし、このようにして、サーバーはユーザーの秘密鍵を認識します。これは私が望んでいることではありません。
もう1つのオプションは、ユーザーの秘密鍵を対称鍵(たとえば、[〜#〜] aes [〜#〜])でラップし、ユーザーだけが知っているようにして、それを保存することです。 [〜#〜] hsm [〜#〜]。
この[〜#〜] aes [〜#〜]キーは、ユーザーのパスワードから取得されます。パスワードからキーを作成するためのPBKDF2のようなメカニズムがあります。
次に、ユーザーがドキュメントへの署名を要求すると、サーバーは、そのユーザーだけが知っている[〜#〜] aes [〜#〜]キーで暗号化されたユーザーの秘密キーを送信します。 。
クライアント側(Androidアプリ、またはjavascriptに基づくwebapp)を使用して署名を作成します。
また、次のように機能するパスワード変更メカニズムが必要になります。
[〜#〜] hsm [〜#〜]モジュールについてはよくわかりませんが、理解しているように、スマートカードと同様の機能を備えています(キーは[〜#〜] hsm [〜#〜]を離れないでください。すべての暗号化が行われるはずです)。
キー生成時にPKCS#11 "CKA_EXTRACTABLE"が設定されている場合、一部のHSMでキー抽出が許可されることをどこかで読みました。しかし、それは、ほとんどの場合、[〜#〜] hsm [〜#〜]の唯一の目的を打ち負かすことではないでしょうか。
また、[〜#〜] hsm [〜#〜]を使用するときに説明したパスワード変更のメカニズムを実装できますか?
別のオプションは、署名が[〜#〜] hsm [〜#〜]で行われ、秘密鍵が[でラップされることです。 〜#〜] aes [〜#〜]キー、ユーザーのパスワードから生成されます。 [〜#〜] hsm [〜#〜]は、秘密鍵をアンラップしてファイルに署名しますが、クラウドプロバイダーは秘密鍵自体にアクセスできません。
この場合、私が説明したパスワード変更メカニズムを実装することは可能でしょうか?
また、パスワードベースの鍵導出メカニズムは、saltを使用して、レインボーテーブル攻撃をより困難にします。
この場合、塩はどのように使用されますか?サービスを使用するときに、サーバーに保存してからクライアントに転送しますか?
要件は、ユーザーが自分のユーザー名/パスワードを知っているだけで、任意のデバイス(モバイル、デスクトップ)でサービスを使用できることです。
サーバーへの認証時に[〜#〜] sms [〜#〜]検証を追加することで、おそらく2FAを含めます。
あなたのスキームは実行可能ですが、HSMのポイントを完全に打ち負かします。プレーンなデータベースストレージでもそれを行うことができます。
HSM(実際には巨大で非常に高速なスマートカードにすぎません)のポイントは、管理者を含む誰もがキーマテリアルを抽出できなくても、キーマテリアルを安全に保存(プライベート)できることです。