Han*_*ank 6 .net passwords unicode hash
我正在为我的.NET应用程序编写密码salt/hash过程,主要遵循本文的指南:http: //www.aspheute.com/english/20040105.asp
基本上,计算盐渍哈希的代码是这样的:
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);
}
Run Code Online (Sandbox Code Playgroud)
但是,我想允许允许用户在他们的密码中使用Unicode字符,如果他们喜欢的话.(这似乎是一个好主意;任何人都可以想到它不是的原因吗?)
不过,我不知道一吨关于Unicode是如何工作的,我很担心,如果我只是改变的两个引用System.Text.Encoding.ASCII到System.Text.Encoding.Unicode,哈希算法可能会产生一些字节的组合不构成有效的Unicode字符和GetString的调用会发飙出.
这是一个有效的问题,还是可以的?
Jon*_*eet 12
您不应该使用任何常规编码将任意二进制数据转换回字符串.它不是编码文本 - 它只是一个字节序列.不要试图将其解释为"正常"文本.原始密码是否包含任何非ASCII字符与此无关 - 您当前的代码已损坏.(我会在此基础上以大量怀疑对待相关文章.)
我会建议:
Encoding.UTF8从密码中获取字节.这将允许密码包含任何unicode字符.Encoding.Unicode这里也没关系.Convert.ToBase64String从计算的散列回文本转换.Base64专门用于表示ASCII字符集中文本中的不透明二进制数据.| 归档时间: |
|
| 查看次数: |
841 次 |
| 最近记录: |