30

次の方法を使用して、nodejs の crypto lib からソルト化およびハッシュ化されたパスワードを作成しています。

crypto.randomBytes(size, [callback])
crypto.pbkdf2(password, salt, iterations, keylen, callback)

randomBytes 呼び出し (SALT の作成) では、どのサイズを使用すればよいですか? 128 ビットのソルトを聞いたことがありますが、おそらく最大 256 ビットです。この関数はバイト単位のサイズを使用しているように見えますが、32 (256 ビット) のサイズで十分だと思いますか?

pbkdf2 呼び出しの適切な反復回数とキーの長さ (keylen) はどれくらいですか?

また、ストレージについては、salt、length、iterations、および derviedkey を同じ列に格納する例を見てきました。4 を で区切る例を使用しています::

salt::derivedKey::keyLength::iterations

これを行うと、分離し::て 4 つの値を取得できるので、提供されたパスワードに基づいて派生キーを生成し、一致するかどうかを確認できます。これは正しい保存方法ですか?それとも、これらの値を組み合わせる際にもう少し「欺く」べきでしょうか?

4

2 に答える 2

35

1. ランダムバイトサイズ:

ソルトは少なくともハッシュ関数と同じサイズであるsha256必要があるため、少なくとも 32 バイトを使用する必要があります。Node.js Cryptopbkdf2は を使用するSHA1ため、最小値は 20 バイトです。ただし、#3 で説明したように、少なくとも64 ビット (8 バイト)を使用する必要があります。(出典: https://crackstation.net/hashing-security.htm )。

2. PBKDF2 反復回数:

素晴らしい議論については、この質問を参照してください。そこから、パフォーマンスに影響を与えずに10.000 の範囲で十分であると判断しましたが、これはハードウェア/パフォーマンスに依存します。

3.PBKDF2の長さ:

キーの長さについては、この他の議論を参照してください。パラメータは、使用されるハッシュ関数です。この場合、SHA-1 であるため、20 バイトが正しい値です。PBKDF2 の標準では少なくとも64 ビットのソルトが推奨されているため、入力よりも小さいキーを生成するのはもったいないため、少なくとも8 バイトを使用してください。追加のセキュリティは提供されませんが、20 の倍数ごとに計算時間が 2 倍になるため、20 を超える出力長は使用しないでください。

4. 変数の保存方法:

上記のすべてのリンク (特に最初の) で説明されているように、ソルトはパスワードと共に保存する必要があります (ただし、他の場所で再利用することはできません)。通常は、結果の文字列 (salt:hash) または別のデータベース列にソルトを最初に追加します。

他の変数に関する限り、それらの知識はセキュリティを侵害するために重要ではありません ( Kerckhoffs の原則で述べられているように、どこでも安全にパラメータ化できます。「::」でそれらを区切ることによってそれを行う方法は問題ありませんが、余分な節約になります情報. Crackstation のコードは を保存するだけ"algorithm:iterations:salt:hash"なので、あなたの場合はだけで十分"salt::derivedKey::iterations"です。

于 2013-10-22T19:12:44.663 に答える
3

Fernando はほぼ正しいですが、#3 はソースが間違っていることに注意してください。推奨されるソルトの長さは、バイトではなく64ビットです。

派生キーに 64 バイトを使用することは許容されますが、salt だけではやり過ぎです。

于 2014-04-02T15:47:20.733 に答える