web-dev-qa-db-ja.com

データベースへの秘密鍵の保存

サーバーアプリケーションがユーザーに代わってファイルに署名できるように、複数のユーザーの秘密鍵を保存する必要があります。

秘密鍵を安全に保管したいのですが、これに関するベストプラクティスが見つかりませんでした。パスワードを保存している場合は、パスワードをソルト+ハッシュして、簡単にパスワードに戻せないハッシュを作成します。ただし、秘密鍵を使用する場合は、後で取得できるように保存する必要があります。

秘密鍵を暗号化してデータベースに保存しようと思っていました。私は当初、各キーが(ユーザーのいくつかのプロパティに基づいて)異なるパスワードで暗号化されると思っていました。ただし、これらのプロパティはデータベースに保存される可能性が高いため、データベースがリークされた場合、攻撃者はすべてを持っています。

アプリケーションだけが知っている単一のパスワードですべての秘密鍵を暗号化できました。次に、攻撃者は私のデータベースと私のアプリケーションを盗んで危害を加える必要があります。

不足しているテクニック/ベストプラクティスはありますか?

17
bramp

ユーザーのパスワードに基づいて、秘密鍵を対称鍵で暗号化できます。追加のソルトを保存し、パスワード「ハッシュ」を実行するだけで、別のキーを取得できます。次に、それを秘密鍵を暗号化するための鍵として使用します。安全なパスワードハッシュを作成するには、PBKDF2、bcrypt、scryptなどのパスワードベースのKey Derivation Function(PBKDF)を使用する必要があることに注意してください(パスワードの通常のセキュリティレベルが与えられた場合)。

署名を生成する必要があるときにユーザーがオンラインでない場合は、自分/バックオフィスだけがキーを復号化できるという意味で、実際にパスワードを保護する必要があります。暗号化/復号化キーを計算するために、いくつかのユーザーID +独自の秘密キーを使用できます。ハイブリッド暗号化復号化を実行するために、個別のRSAキーペアを生成することもできます。

ユーザーに代わって秘密鍵を保管することは非常に危険な行為です。秘密鍵が公開される方法はたくさんあります(サイドチャネル攻撃など)。専門的に行うには、プロセスのどこかでHSMを使用する必要があります。これが重大なデータに関するものである場合は、専門家および弁護士に相談してください。

17
Maarten Bodewes