我已经使用此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函数的文档中:
返回值
varbinary(最大8000个字节)
这里的问题是,您试图将任意二进制数据(HASHBYTES的输出)解释为文本值,这将不起作用。在这种情况下,SQL Server尝试将原始字节值解释为数据库正在使用的任何归类中的字符。
以文本形式表示二进制数据的标准方法是将其转换为base64表示形式。为此,请在C#中将最后一行替换为:
string hashedpassword = Convert.ToBase64String(hashedBytes);
然后在您的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;
如果运行此命令,将会观察到base64编码值是相同的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句