web-dev-qa-db-ja.com

bcryptハッシュパスワードのソルトを個別に保存する必要があります

パスワードストレージシステムを交換します。現在の実装では、バイナリと構成の両方にプレーンテキストで格納されたキーを使用してTripleDESを使用します(いずれかが何らかの理由(DSTM)で利用できない場合)、アプリケーションはデータベースから値を復号化し、それをチェックしますクライアントから送信されたプレーンテキスト値。

これをBCrypt(この場合はBCrypt.Net)に置き換えることを提案します。例として次のコードを使用します

int workFactor = ((DateTime.Now.Year - 2000) / 2) + 6;
string salt = BCrypt.Net.BCrypt.GenerateSalt(workFactor);
Console.WriteLine("Salt: " + salt);
string password = "some test password";
string passwordHash = BCrypt.Net.BCrypt.HashPassword(password, salt);
Console.WriteLine("PW: " + passwordHash);
Console.WriteLine("Verify: " + BCrypt.Net.BCrypt.Verify(password, passwordHash));

これの1つの出力は

Salt: $2a$14$zhJH43uFxZU3FJ9FaFQusO
PW: $2a$14$zhJH43uFxZU3FJ9FaFQusOn7bJTsXZQgXpEGYFBIygd.8lGXIcc22
Verify: True

私がソルトを指定しなかったときにVerifytrueを返したとき、ソルト値とパスワード値の間にセパレータがないことに気付きました。

ハッシュされたパスワード出力にソルトが含まれている場合、$2a$14$zhJH43uFxZU3FJ9FaFQusO$2a$14$zhJH43uFxZU3FJ9FaFQusOn7bJTsXZQgXpEGYFBIygd.8lGXIcc22を別々に格納することに何か価値がありますか?

次回ユーザーがとにかくパスワードを選択するときに、おそらくユーザーのために新しいソルトを生成したいと思うでしょう。

1
user64273

いいえ、ご覧のとおり、ソルトは結果のハッシュ値の一部です(コスト係数の後の22文字)。 BCrypt.Verify()関数は、保存されたハッシュからソルトを抽出するため、個別に保存しても意味がありません。

パラメータを1つだけ使用して関数を呼び出すことができます。ライブラリは、独自にソルトとコスト係数を生成します。

string passwordHash = BCrypt.HashPassword(password);
// or if you want to specify the cost factor
passwordHash = BCrypt.HashPassword(password, 12);
2
martinstoeckli