c# - 使用 Sha256 散列字符串

标签 c# string hash sha256

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

相关文章:

mysql - 在 MySQL 中提取子字符串

c++ - 不使用递归求解所有二维字符串 vector 组合? (C++)

java - php 的 hmac sha256 实现与 java 的不匹配

c# - 在没有索引的情况下同时枚举两个列表的模式是什么?

c# - 在 C# 中使用表达式访问结构属性

c# - 使用 C# 使用 CSV 文件填充 DataGridView,并使用结果更新 Access 数据库

language-agnostic - "Alphanumeric"哈希 - A-Z, 0-9

c# - 将大型 ASP.NET VB.NET 项目转换为 C# - 增量?

c++ - 指向 int 类型的指针在 C++ 中不能正常协作

c - 如果哈希表是用二维数组实现的,但数组的第二维永远不会被访问,那么效率会损失多少?