我正在写一个密码盐/哈希程序为本人.NET应用程序,这篇文章的导向主要是以下几点: http://www.aspheute.com/english/20040105.asp哈希Unicode的密码
基本上用于计算哈希腌制的代码是这样的:
public string ComputeSaltedHash(string password, byte[] salt) {
// Get password ASCII text as bytes:
byte[] passwordBytes = System.Text.Encoding.ASCII.GetBytes(password);
// Append the two arrays
byte[] toHash = new byte[passwordBytes.Length + salt.Length];
Array.Copy(passwordBytes, 0, toHash, 0, passwordBytes.Length);
Array.Copy(salt, 0, toHash, passwordBytes.Length, salt.Length);
byte[] computedHash = SHA1.Create().ComputeHash(toHash);
// Return as an ASCII string
return System.Text.Encoding.ASCII.GetString(computedHash);
}
不过,我想允许允许用户使用Unicode字符的密码,如果他们喜欢。 (这似乎是一个好主意,任何人都可以想到它不是的原因吗?)
但是,我不知道Unicode是如何工作的,而且我担心如果我只是将System.Text.Encoding.ASCII
这两个引用都更改为System.Text.Encoding.Unicode
,哈希算法可能会产生一些字节的组合不构成有效的Unicode字符和GetString的调用将吓坏了。
这是一个有效的关注,还是会好吗?
好一点。这个问题与Unicode的实现无关。现有的ASCII实现同样存在缺陷。 – 2010-11-16 16:15:34
感谢您对ASCII编码的深刻见解。这让我想起了Eric Lippert的一篇文章,其道德是“不要使用你不完全了解的密码系统”(http://blogs.msdn.com/b/ericlippert/archive/2009/12/ 14 /使用最右工具换的-job.aspx)。附: - 刚刚收到我的C#深入2ED电子书,期待花一些时间与它! – 2010-11-16 16:40:42