2011-11-08 23 views
2

我重复使用了一些旧代码,并且看到我一直在使用此代码生成SHA1哈希。.net4上的SHA1代

HashAlgorithm sha = new SHA1CryptoServiceProvider(); 
return sha.ComputeHash((new UnicodeEncoding()).GetBytes(password.Trim())); 

当我使用下面的代码来生成一个SHA1哈希我不相同的哈希,当我与测试,例如结束了,http://gtools.org/tool/sha1-hash-generator/

哪一个是正确的?

我在这里做错了什么?

回答

4

最有可能是编码的差异。您正在使用UTF-16。尝试使用UTF-8。

刚刚确认此网站使用UTF-8。但是他们的代码被破坏了某些字符,如',因为他们通过sql转义输入他们的输入。

但用普通的SHA-1散列密码几乎从来都不是正确的选择。在大多数情况下,例如存储用于登录您网站的密码,您应该使用适当的密码散列函数,例如PBKDF2,bcrypt或scrypt以及适当的盐。

PBKDF2是.NET中实施了SHA-1腌制的Rfc2898DeriveBytes Class

+2

作出这样的 “SHA-1的*非种子选手单*应用程序是几乎从来没有......” – Richard

+0

感谢您的输入!当只通过SSL运行时,情况也是如此吗? –

+1

@nj。 SSL在这种情况下无关紧要,因为密码被存储在数据库中,以防止被盗的数据库。通过网络发送的密码不应被散列,而应使用SSL进行保护。 – CodesInChaos

0

例子:

return Convert.ToBase64String(
    new HMACSHA1(
     Encoding.UTF8.GetBytes(salt)) 
    .ComputeHash(
     Encoding.UTF8.GetBytes(input))); 
+0

我的理解是,这个功能是作为一个MAC设计的。这反过来意味着它很快。您需要使用迭代方案来减慢速度,这正是PBKDF2所做的。 – CodesInChaos