私は次の方法を使用して、nodejsのcryptolibからソルトおよびハッシュされたパスワードを作成しています。
crypto.randomBytes(size, [callback])
crypto.pbkdf2(password, salt, iterations, keylen, callback)
RandomBytes呼び出し(SALTの作成)には、どのサイズを使用する必要がありますか? 128ビットのソルト、おそらく256ビットまで聞いたことがあります。この関数はバイト単位のサイズを使用しているようですが、32(256ビット)のサイズで十分だと思いますか?
Pbkdf2呼び出しの場合、適切な反復回数とキー(keylen)の適切な長さはどれくらいですか?
また、ストレージについては、ソルト、長さ、反復、およびderviedkeyを同じ列に格納する例を見てきました。 4を::
で区切る例を使用しています。つまり、次のようになります。
salt::derivedKey::keyLength::iterations
これを行うと、::
で分離して4つの値を取得できるため、提供されたパスワードに基づいて派生キーを生成し、一致するかどうかを確認できます。これはこれを保存する正しい方法ですか?それとも、これらの値を組み合わせる際にもう少し「欺く」必要がありますか?
1。ランダムバイトサイズ:
ソルトは少なくともハッシュ関数と同じサイズである必要があるため、sha256
には少なくとも32バイトを使用する必要があります。 Node.jsCryptoのpbkdf2
はSHA1
を使用するため、20バイトが最小である必要があります。ただし、#3で説明したように、使用する必要があるのは64ビット(8バイト)です。 (出典: https://crackstation.net/hashing-security.htm )。
2。 PBKDF2の反復回数:
すばらしい議論については この質問 を参照してください。 10.000 rangeは、パフォーマンスに影響を与えることなく十分であると私は考えましたが、これはハードウェア/パフォーマンスに依存します。
3。 PBKDF2の長さ:
キーの長さについては この他の議論 を参照してください。このパラメーターも使用されるハッシュ関数であり、この場合はSHA-1であるため、20バイトが正しい値です。 PBKDF2の標準 は少なくとも64ビットのソルトを推奨しているため、入力よりも小さいキーを生成するのは無駄です。最小8バイト。 20を超える出力長は使用しないでください。追加のセキュリティは提供されませんが、20の倍数ごとに計算時間が2倍になります。
4。変数の保存方法:
上記のすべてのリンク(特に 最初の )で説明されているように、ソルトはパスワードに沿って保存する必要があります(ただし、他の場所で再利用することはできません)。データベース列。
他の変数に関しては、セキュリティを侵害するためにそれらの知識は重要ではありません( ケルクホフスの原理 で述べられているように、どこでも安全にパラメータ化できます。「::」で区切ることでそれを行う方法は結構です、しかしあなたは余分な情報を保存していますCrackstationのコード 保存するのは"algorithm:iterations:salt:hash"
だけなので、あなたの場合は"salt::derivedKey::iterations"
が必要なすべてです。
フェルナンドはほとんど正しいですが、#3が誤って供給されていることに注意してください。推奨されるソルトの長さは64 ビットであり、バイトではありません。
派生キーに64バイトを使用することは許容されますが、ソルトだけではやり過ぎになります。