パスワードの保存に関する Jeff Atwood の投稿を読んだ後、私は BCrypt.net に出くわしました。これにより、Thomas Ptacek が BCrypt を使用してパスワードを保存することを勧めました。最終的に、この BCrypt の C# 実装にたどり着きました
上記の最後のリンクのコメントで、誰かが「GenerateSalt(30) には時間がかかるのに、GenerateSalt(31) にはまったく時間がかからないように見えるのはなぜですか?」と尋ねました。
BCrypt.HashPassword(password, BCrypt.GenerateSalt(31)) を実行したところ、0 ミリ秒で結果が得られました。
BCrypt.HashPassword("password", BCrypt.GenerateSalt(30)) を 5 分以上実行していますが、まだ結果がありません。
パスワード ハッシュ (またはBCrypt の場合は元に戻せない暗号化)を作成するために、ランダムに生成された 30 文字のソルトはおそらく何年も必要ないでしょう。編集私はコードを少し読むべきでした.logRoundsはソルトの長さとは何の関係もありません. ありがとうアーロノート。
では、GenerateSalt(31) がほぼ瞬時に値を返すのはなぜですか (GenerateSalt(30) の約 2 倍の時間がかかるのに)。
アップデート
ここに修正があります:
private byte[] CryptRaw(byte[] password, byte[] salt, int logRounds) {
// ... snip ...
uint rounds = 1U << logRounds;
// ... snip
}