gpt4 book ai didi

c# - 使用 Sha256 散列字符串

转载 作者:IT王子 更新时间:2023-10-29 03:32:50 28 4
gpt4 key购买 nike

我尝试使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com