【问题标题】:SHA2_512 encryption c# and SQL methods gives different resultsSHA2_512 加密 c# 和 SQL 方法给出不同的结果
【发布时间】:2015-03-09 15:46:30
【问题描述】:

我已经使用这个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·ûŠÈ"

为什么这些 to 方法有区别?

【问题讨论】:

标签: c# sql sha512


【解决方案1】:

来自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 编码的值是相同的。

【讨论】:

  • varbinary(最大 8000 字节)不适用于 SQL Server 2016 和 >
猜你喜欢
  • 2020-10-08
  • 2015-06-26
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 2018-08-30
相关资源
最近更新 更多