web-dev-qa-db-ja.com

データを暗号化して同じパスワードでログインする方法-再考

データを暗号化して同じパスワード/キーでログインする方法のトピックに関する以前の投稿を読みましたが、その概念、特にデータベースに安全に保存できるデータについては、まだはっきりしていません。

この素晴らしい投稿 は、次の2つの可能性を助言しました:

1:PBKDF2を使用してパスワードから暗号化キーを取得し、ログイン用のパスワードハッシュとしてキーの通常の暗号化ハッシュ(SHA-256など)を使用できます。

2:または、さらに注意が必要な場合は、PBKDF2を使用してパスワードから派生した中間キーから暗号化キーとパスワードハッシュの両方を取得します。

2番目の可能性に対する理解の図を作成しました。私が正しく受け取ったと思いますか?あなたはそれを実装するより良い方法を考えることができますか?

N.b。

  1. ここではPBKDF2scryptに置き換えましたが、概念は同じです。
  2. ソルトは、urandomで生成されたランダムな16バイトです

enter image description here

[〜#〜] update [〜#〜]PyCryptodomex(Python)ライブラリがscrypt関数を提供していることを発見しました。単一の入力キーから必要なハッシュ/キーの数を指定できます。たとえば、256ビット長の出力ハッシュが2つ必要な場合、それを指定できます。scrypt2 * 256bit = 512bitキーを作成し、単純に2で除算して、256ビット長のハッシュを2つ生成します。その後、1つのハッシュをデータの暗号化に使用し、もう1つを認証に使用できるため、前の概念での第2レベルのscrytおよびSHA256ハッシュの必要がなくなります。私は新しいコンセプトの視覚的な説明を作成しました。それについてのあなたの意見に感謝します:)

enter image description here

要約使用するライブラリとKDFに応じて、コンセプト1またはコンセプト2(基本的に同じですが、よりコンパクト)が機能すると思います。

2
Peter

「PW-Hash + Salt」とは、派生キーを意味する場合、あなたの理解は正しいです。

いくつかのバリエーションを見ました

  • 使用するたびに異なるソルトを使用する(つまり、ソルト1とソルト2)。 これにはいくつかの理論的な利点がありますが、私はそれを十分に大きいとは考えていません。
  • (ハッシュ/キー導出の)2番目のラウンドでも入力としてPWを使用します。 繰り返しますが、十分なメリットがあるかどうかはわかりませんが、コストはごくわずかです。
  • 鍵導出関数で多数のラウンドを使用する(おそらくこれを暗示する)。 これは重要なことです。全体のアイデアは、関係する作業要素を増やすことです。
  • OWASPは、ここで32または64バイトのソルトを推奨しています: https://www.owasp.org/index.php?title=Password_Storage_Cheat_Sheet 。現時点では、IMHOの利点は理論的なものです。16バイトを超える反復は攻撃者にとって簡単な仕事ではないためです。

一般的に、私は「念のためやってみよう」という論理(つまり、リスクとベネフィットを評価せずに恐怖を決断させる)は好きではありません。 Intermediate Keyの全体的な概念については懐疑的です。 YMMV。 :)

3
Sas3