我使用此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·ûŠÈ“
为什么这些方法有区别?
答案 0 :(得分:4)
来自HASHBYTES功能的documentation:
返回值
varbinary(最多8000字节)
这里的问题是你试图将任意二进制数据(HASHBYTES的输出)解释为文本值,它只是不起作用。在这种情况下,SQL Server正在尝试将原始字节值解释为数据库正在使用的任何排序规则中的字符。
以文本形式表示二进制数据的标准方法是将其转换为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编码的值是相同的。