SHA2_512 加密 c# 和 SQL 方法给出不同的结果

SHA2_512 encryption c# and SQL methods gives different results

我使用此 c# 代码

截获了单词 "admin"
Byte[] inputBytes = Encoding.UTF8.GetBytes(stringpassword);
SHA512 shaM = new SHA512Managed();
Byte[] hashedBytes = shaM.ComputeHash(inputBytes);

string hashedpassword = BitConverter.ToString(hashedBytes);

并得到了这个 "DA-EF-49-53-B9-78-33-65-CA-D6-61-52-23-72-05-06-CC" 的结果。我使用 SQL 存储过程

加密同一个词 "admin"
SET @password = HASHBYTES('SHA2_512',@password);

并将其作为输出“ÇDÈv*] ¤RùèTýÁàç¥*8_#óê±Ø“ÔrcMúÇÓN¼5Ñj·ûŠÈ”

为什么这些方法有区别?

来自 HASHBYTES 函数的 documentation

Return Value

varbinary (maximum 8000 bytes)

这里的问题是您试图将任意二进制数据(HASHBYTES 的输出)解释为文本值,这是行不通的。在这种情况下 SQL 服务器试图将原始字节值解释为数据库使用的任何排序规则中的字符。

以文本形式表示二进制数据的标准方法是将其转换为 base64 表示形式。要在 C# 中执行此操作,请将最后一行替换为:

string hashedpassword = Convert.ToBase64String(hashedBytes);

然后在您的 SQL 中,您可以执行以下操作将您的散列值转换为 base64(基于 this SO answer):

DECLARE @hashedValue VARBINARY(8000) = HASHBYTES('SHA2_512', 'admin')
SELECT
    CAST(N'' AS XML).value(
          'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
        , 'VARCHAR(MAX)'
    )   Base64Encoding
FROM (
    SELECT @hashedValue AS bin
) AS bin_sql_server_temp;

如果您运行这样做,您会发现 base64 编码值是相同的。