あなたが求めていることを正確に行う1つの方法は次のとおりです。
- セキュリティ レベル N を定義します。大きいほど安全ですが、このプロセスは遅くなります。
- 「ソルト」を生成し、それをユーザーの ID に関連付けます。
- RSA 鍵の生成には安全な乱数ジェネレーターが必要なため、ユーザーのパスワードとソルトを PBKDF2 で使用し、反復 N から開始して、安全なランダム データを生成します。
このプロセスは、公開/秘密 RSA キーのペアを決定論的に生成する必要があります。ただし、これを行わない理由は次のとおりです。
- これは私が作成したものであり、私の知る限り、この投稿は、このプロセスが公に精査されるのは初めてです。
- PBKDF2 が実際に RSA で使用する安全な乱数ジェネレーターとして機能するかどうかはわかりません。
- PBKDF2 が公開/秘密 RSA キー ペアの元となるデータを生成することが保証されていることは、真実である場合とそうでない場合があります。
- 実際には、これは機能しますが、非常に長い時間がかかり、かかる時間はユーザーのパスワードに基づいています。これは、ユーザー エクスペリエンスと、考慮が必要なセキュリティ上の露出ポイントです。
あなたがやろうとしていることを達成するためのより良い方法は次のとおりです。
- セキュリティ レベル N を定義します。大きいほど安全ですが、このプロセスは遅くなります。
- 「ソルト」を生成し、それをユーザーの ID に関連付けます。
- RSA 公開鍵と秘密鍵のペアを生成します。
- PBKDF2 を N 回繰り返して、ユーザーのパスワードとソルトに基づいて対称キーを作成します。
- 対称暗号化アルゴリズムを使用して秘密鍵を暗号化します。
- 暗号化されていない公開鍵と暗号化された秘密鍵をサーバーにアップロードします。
これは次の理由で優れています。
- 上記のすべてのプロセスは、私の知る限り、標準的で精査済みです。
- 公開鍵/秘密鍵の生成 (時間がかかる) は、ユーザーのアカウントを設定するときに 1 回だけ行われます。
- キーへのアクセスは、常に一定の時間内に発生します。
これはあなたの問題を解決します:
- サーバーには暗号化された秘密鍵しかないため、ユーザーのデータを復号化することはできません。
- クライアント マシンが停止した場合、サーバーは秘密鍵を再発行できます。
もちろん、ユーザーがパスワードを忘れた場合、RSA をクラックする方法に関する一般知識が利用可能になるか、10 億年分の現在のコンピューティング パワーがパスワードを解読するタスクに投入されるまで、すべてのデータがロックされるなどの明らかな警告があります ;-) (もちろん、N と鍵のサイズによって異なります)。また、ソルトは辞書攻撃を防ぐためにも重要です。