我尝试使用 SHA256 对字符串进行哈希处理,我使用的是以下代码:
using System;
using System.Security.Cryptography;
using System.Text;
public class Hash
{
public static string getHashSha256(string text)
{
byte[] bytes = Encoding.Unicode.GetBytes(text);
SHA256Managed hashstring = new SHA256Managed();
byte[] hash = hashstring.ComputeHash(bytes);
string hashString = string.Empty;
foreach (byte x in hash)
{
hashString += String.Format("{0:x2}", x);
}
return hashString;
}
}
但是,与我的 friend php 以及在线生成器(例如 This generator)相比,这段代码给出的结果明显不同
有人知道错误是什么吗?不同的基地?
最佳答案
Encoding.Unicode
是 Microsoft 对 UTF-16 的误导性名称(一种双宽度编码,出于历史原因在 Windows 世界中使用,但未被其他任何人使用)。 http://msdn.microsoft.com/en-us/library/system.text.encoding.unicode.aspx
如果您检查您的 bytes
数组,您会看到每隔一个字节都是 0x00
(因为双宽度编码)。
您应该改用 Encoding.UTF8.GetBytes
。
而且,您会看到不同的结果,具体取决于您是否将终止 '\0'
字节视为您正在散列的数据的一部分。对两个字节"Hi"
进行散列处理将得到与对三个 字节"Hi"
进行散列处理不同的结果。你必须决定你想做什么。 (大概你想做你 friend 的 PHP 代码正在做的任何一个。)
对于 ASCII 文本,Encoding.UTF8
绝对适合。如果您的目标是与您 friend 的代码完美兼容,即使是在非 ASCII 输入上,您最好尝试一些非 ASCII 字符的测试用例,例如 é
和 家
并查看您的结果是否仍然匹配。如果不是,您将不得不弄清楚您的 friend 真正使用的是什么编码;它可能是 Unicode 发明之前流行的 8 位“代码页”之一。 (同样,我认为 Windows 是任何人仍然需要担心“代码页”的主要原因。)
关于c# - 使用 Sha256 散列字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12416249/