2017-11-25 283 views
1
public static string GenerateHash(string password, string salt, int iterations) 
    { 
     var pbkdf2 = new Rfc2898DeriveBytes(password, Convert.FromBase64String(salt), iterations); 
     var keyBytes = pbkdf2.GetBytes(32); 
     return Convert.ToBase64String(keyBytes); 
    } 

我得到一个哈希密码是用于一个zip档案,但我不知道我是否实际上正确检索哈希。这是在c#中的PBKDF2的正确实现

回答

1

嗯,我认为这个问题的答案是:绝对是的。 为了充分评估您的方法,有几个缺失的部分会很有趣,特别是您如何构建盐以及如何验证密码。

这是我会怎么做:

public static String HashPassword(String password) 
{ 
    Byte[] salt = new Byte[24]; 

    RNGCryptoServiceProvider cryptoProvider = new RNGCryptoServiceProvider(); 
    cryptoProvider.GetBytes(salt); 

    Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, salt, 1000); 

    return Convert.ToBase64String(pbkdf2.GetBytes(20)); // Size of PBKDF2-HMAC-SHA-1 Hash 
} 
+0

我生成的盐的方法是完全一样有描述,只是在一个单独的方法。 原因是我想将salt作为注释存储在zip存档中。 这样,当我们的程序尝试打开它时,它知道要添加到用户的密码中。 我认为这是相当安全的? 我听说一个暴露的盐不是特别危险 – user5113199

+1

@ user5113199我不能评论这里的具体情况,但一般来说盐渍的目的是防止彩虹表,而不是使任何密码“更安全”。所以从这个角度来看,盐应该是公开的。请记住,解锁zip文件是一个脱机过程,bruteforce可以在全功能下发生,因此了解salt *会减少攻击者的复杂程度。 – poke

+1

@ user5113199 Salt的意思是公开的 - 存储它们的常用方法是将它们预先加密到密文。所以了解盐并不会降低安全性。 – ckuri

相关问题