哈希在Unicode密码上

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.ASCIISystem.Text.Encoding.Unicode,哈希算法可能会产生一些字节的组合不构成有效的Unicode字符和GetString的调用会发飙出.

这是一个有效的问题,还是可以的?

Jon*_*eet 12

您不应该使用任何常规编码将任意二进制数据转换回字符串.它不是编码文本 - 它只是一个字节序列.不要试图将其解释为"正常"文本.原始密码是否包含任何非ASCII字符与此无关 - 您当前的代码已损坏.(我会在此基础上以大量怀疑对待相关文章.)

我会建议:

  • 用于Encoding.UTF8从密码中获取字节.这将允许密码包含任何unicode字符.Encoding.Unicode这里也没关系.
  • 使用Convert.ToBase64String从计算的散列回文本转换.Base64专门用于表示ASCII字符集中文本中的不透明二进制数据.