gpt4 book ai didi

c# - SQL 和 C# 中的哈希不同?

转载 作者:太空狗 更新时间:2023-10-29 20:23:36 26 4
gpt4 key购买 nike

在我的数据库中我有 SQL,

DECLARE @InputString nvarchar(15) ='pass'
DECLARE @InputSalt nvarchar(36) = 'FC94C37C-03A3-49A3-9B9F-D4A82E708618'

DECLARE @HashThis nvarchar(100)
Declare @BinaryHash varbinary(max)
set @HashThis = @InputString + @InputSalt
set @BinaryHash= HASHBYTES('SHA1', @HashThis)
SELECT CAST(N'' AS XML).value('xs:base64Binary(xs:hexBinary(sql:variable("@BinaryHash")))', 'VARCHAR(MAX)')

我有 C#,

public static string HashString(string cleartext)
{
byte[] clearBytes = System.Text.Encoding.UTF8.GetBytes(cleartext);
return HashBytes(clearBytes);
}

public static string HashBytes(byte[] clearBytes)
{
var hasher = System.Security.Cryptography.SHA1.Create();
byte[] hashBytes = hasher.ComputeHash(clearBytes);
string hash = System.Convert.ToBase64String(hashBytes);
hasher.Clear();
return hash;
}
HashString("passFC94C37C-03A3-49A3-9B9F-D4A82E708618")

但是散列不同?

C# Output: S55Nz1lyGweoJEHWcC6zFxJDKWQ=
SQL Output: 4jqyC1pLJ0hW+AMNk8GOWCC99KY=

https://dotnetfiddle.net/4bwAtm

最佳答案

您的散列函数在字节上运行,而不是在字符上运行。您有效地将字符转换为字节,但您在 C# 中的执行方式与在 SQL 中的执行方式不同:您使用来自 SQL 的 nvarchar (UTF-16),您使用来自 SQL 的 UTF-8 C#。您可以更改其中一个以匹配另一个。

由于您当前的测试中没有任何非 ASCII 字符,对于该特定密码,您可以通过简单地将 nvarchar 更改为 varchar< 来轻松验证这是问题所在 在你的 SQL 中。但是,这对于所有 Unicode 字符来说是不够的。

关于c# - SQL 和 C# 中的哈希不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32885216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com