英文:
Microsoft SHA256 Hash Gives "Incorrect" value for string.empty
问题
差异的原因在于编码方式的不同。在你提到的情况中:
- 如果使用SHA256哈希算法对空字符串进行哈希,并将其以十六进制字符串形式表示,结果是 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"。
- 如果使用SHA256哈希算法对空字符串进行哈希,并将其以Base64编码的形式表示,结果是 "ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3ODUyYjg1NQ=="。
然而,你提到的C#代码中使用的是UTF-8编码的空字符串进行SHA256哈希,并将结果以Base64编码的形式表示,因此结果是 "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="。
差异的原因是编码方式的不同,一个是对十六进制字符串进行哈希,另一个是对UTF-8编码的字符串进行哈希,然后再进行Base64编码。
英文:
I don't know if it's a "spec" or generally agreed upon or linux or just google, but many sites say that the SHA256 hash for an empty string is e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 or base64
"ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3ODUyYjg1NQ=="
However, given the following code in C#
using (var sha256 = SHA256.Create())
{
var contentBytes = System.Text.Encoding.UTF8.GetBytes(content);
byte[] hashedBytes = sha256.ComputeHash(contentBytes);
var hash = Convert.ToBase64String(hashedBytes);
return hash;
}
the base64 value of hash where content=string.empty or content="" will be "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="
Why the difference?
答案1
得分: 1
You're most likely seeing a BOM being emitted from the UTF8 encoder.
Edit: Maybe not. This works for me:
var content = string.Empty;
using (var sha256 = SHA256.Create())
{
var contentBytes = System.Text.Encoding.UTF8.GetBytes(content);
byte[] hashedBytes = sha256.ComputeHash(contentBytes);
Console.WriteLine(BitConverter.ToString(hashedBytes).Replace("-", "").ToLowerInvariant());
}
Output:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
The "ZTNiMG..." is the Base64 representation of the string "e3b0c..." and not the bytes e3 b0 c4...
. So the "47DEQ..." is actually correct.
If you insist on the "ZTNiMG..." string then use this:
var content = string.Empty;
using (var sha256 = SHA256.Create())
{
var contentBytes = System.Text.Encoding.UTF8.GetBytes(content);
byte[] hashedBytes = sha256.ComputeHash(contentBytes);
Console.WriteLine(Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(BitConverter.ToString(hashedBytes).Replace("-", "").ToLowerInvariant())));
}
Output:
ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3ODUyYjg1NQ==
英文:
<s>You're most likely seeing a BOM being emitted from the UTF8 encoder.</s>
Edit: Maybe not. This works for me:
var content = string.Empty;
using (var sha256 = SHA256.Create())
{
var contentBytes = System.Text.Encoding.UTF8.GetBytes(content);
byte[] hashedBytes = sha256.ComputeHash(contentBytes);
Console.WriteLine(BitConverter.ToString(hashedBytes).Replace("-","").ToLowerInvariant());
}
Output:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
The "ZTNiMG..." is the Base64 representation of the string "e3b0c..." and not the bytes e3 b0 c4...
. So the "47DEQ..." is actually correct.
If you insist on the "ZTNiMG..." string then use this:
var content = string.Empty;
using (var sha256 = SHA256.Create())
{
var contentBytes = System.Text.Encoding.UTF8.GetBytes(content);
byte[] hashedBytes = sha256.ComputeHash(contentBytes);
Console.WriteLine(Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(BitConverter.ToString(hashedBytes).Replace("-","").ToLowerInvariant())));
}
Output:
ZTNiMGM0NDI5OGZjMWMxNDlhZmJmNGM4OTk2ZmI5MjQyN2FlNDFlNDY0OWI5MzRjYTQ5NTk5MWI3ODUyYjg1NQ==
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论