2016-07-22 3 views
4

パスワードハッシュを計算するための新しい方法を書いて、私たちがまだ十分に安全ではないと感じた古いものを置き換える作業を任されました。良い前に、私は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); 
     } 
    } 
} 

答えて

4

あなたは正しい考え方/アプローチを持っている - ここでは少し良い実装です:

byte[] ComputeHash(string user, string salt, string password) 
{ 
    using (var pbkdf2 = new PBKDF2(HMACFactories.HMACSHA512, password, salt.ToBytes())) 
    using (var hkdf = new HKDF(HMACFactories.HMACSHA512, pbkdf2.GetBytes(64), user.ToBytes())) 
     return hkdf.GetBytes(64); 
} 

あなたはあなたのケースでは根本的なPRF(のバイト長よりも多くのバイトについてpbkdf2に尋ねるべきではありません、64バイトを生成するSHA512)。

hkdfのコンテキストをnullのままにしておくことはできません。

上記のコードで使用されているライブラリが不明な他の人のために - Inferno crypto

関連する問題