微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Hash在SQL和C#中有所不同吗?

在我的数据库我有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),使用C#中的UTF-8.您可以更改其中一个以匹配另一个.

由于当前测试中没有任何非ASCII字符,因此只需将sql中的nvarchar更改为varchar,即可轻松验证是否存在此问题.但这对于全范围的Unicode字符来说是不够的.

原文地址:https://www.jb51.cc/mssql/77128.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐