C#中的字符串SHA256哈希值与网站上的哈希值不一致

6
如果我使用下面的方法在C#中使用SHA256哈希字符串"password",我会得到以下输出结果:
e201065d0554652615c320c00a1d5bc8edca469d72c2790e24152d0c1e2b6189

但是这个网站(SHA-256生成一个256位(32字节)的哈希值)告诉我哈希值是:

5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8

我显然遇到了数据格式问题或类似的问题。 你有什么想法,为什么这个C# SHA256Managed方法返回不同的结果? 我将"password"作为输入参数发送给该方法。

    private static string CalculateSHA256Hash(string text)
    {
        UnicodeEncoding UE = new UnicodeEncoding();
        byte[] hashValue;
        byte[] message = UE.GetBytes(text);

        SHA256Managed hashString = new SHA256Managed();
        string hex = "";

        hashValue = hashString.ComputeHash(message);
        foreach (byte x in hashValue)
        {
            hex += String.Format("{0:x2}", x);
        }
        return hex;
    }

2
请不要使用SHA256哈希算法来存储密码(假设您从头开始设计)。请了解一下现代的密码存储方法,您应该使用类似于这个链接中提到的方法:https://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes(v=vs.110).aspx 或者其他多次迭代的方法。 - willaien
2
谢谢提供链接。我们正在使用SHA256,后端对用户进行唯一的盐处理,并且我们没有进行双重哈希。看起来我们可以做出的改进是使用PBKDF2代替SHA256。 - LampShade
2个回答

13

UnicodeEncoding 是UTF-16编码,将所有字符膨胀为2到4个字节以表示它们的Unicode代码点(请参阅MSDN上的备注部分)。

请改用(静态的)Encoding.UTF8,这样大多数字符就可以适应一个字节。 是否对所有字符串有效取决于您需要模仿哪个系统。


0

在上面的答案中使用Encoding.UTF8计算哈希后,我还会返回以下字符串:

 hex = BitConverter.ToString(hashValue).Replace("-", "");

 return hex;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接