パスワードハッシュを計算するための新しい方法を書いて、私たちがまだ十分に安全ではないと感じた古いものを置き換える作業を任されました。良い前に、私はSecurity Driven .NETの本を読んでいました。重要な部分は(単純なハッシュとは対照的に)構成可能な回転量のアルゴリズムを使用することです。パスワード処理のためにPBKDF2
と呼ばれています。また、ASP.NETがパスワードを扱う方法の改善として、PBKDF2を使用してマスターを作成することによって、データベースに格納された結果ハッシュが暗号化されてユーザー(名前またはID)に関連付けられていれば、キーを押してから、ユーザー名(またはID)を使用してHKDFを使用して派生キーを作成します。しかし、これはまた、私が現在アクセスできない本から読んだ浅い知識なので、私の記憶が正しいかどうか再確認できません。.NETでPBKDF2とHKDFを使用したパスワードハッシュ
また、以前は.NET DerivedBytes APIを使用していなかったため、間違っている可能性があります。だから私の質問はこれです:私は次のコードで物事を正しくしていますか? APIを正しく使用していますか?この実装は「十分に安全」ですか?あるいは、セキュリティを完全に削除する何かを間違ってやっていますか?
protected override byte[] ComputeHash(string user, string salt, string password)
{
var userBytes = user.ToBytes();
using (var pbkdf2 = new PBKDF2(MacFactories.HMACSHA512, password.ToBytes(), salt.ToBytes()))
{
var masterKey = pbkdf2.GetBytes(128);
using (var hkdf = new HKDF(MacFactories.HMACSHA512, masterKey, userBytes, userBytes))
{
return hkdf.GetBytes(64);
}
}
}