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

Saj*_*nga 1 c# sql sha512

我已经使用此C#代码拦截了“ admin”一词

Byte[] inputBytes = Encoding.UTF8.GetBytes(stringpassword);
SHA512 shaM = new SHA512Managed();
Byte[] hashedBytes = shaM.ComputeHash(inputBytes);

string hashedpassword = BitConverter.ToString(hashedBytes);
Run Code Online (Sandbox Code Playgroud)

并获得了此结果“ 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);
Run Code Online (Sandbox Code Playgroud)

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

为什么这些方法之间有区别?

Jar*_*ell 6

从HASHBYTES函数的文档中:

返回值

varbinary(最大8000个字节)

这里的问题是,您试图将任意二进制数据(HASHBYTES的输出)解释为文本值,这将不起作用。在这种情况下,SQL Server尝试将原始字节值解释为数据库使用的任何归类中的字符。

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

string hashedpassword = Convert.ToBase64String(hashedBytes);
Run Code Online (Sandbox Code Playgroud)

然后在您的SQL中,您可以执行以下操作将哈希值转换为base64(基于此SO答案):

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;
Run Code Online (Sandbox Code Playgroud)

如果运行此命令,将会观察到base64编码值是相同的。