.Net SHA1CryptoServiceProvider与SQL Hashbytes不匹配

在使用Hashbytes转换存储在SQL中的一些明文密码后,似乎无法让.Net生成正确的匹配哈希.

用于转换密码的SQL:

UPDATE Users
SET UserPassword = HASHBYTES('SHA1', UserPassword + CAST(Salt AS VARCHAR(36)))

现在用于生成哈希的.Net代码:

Dim oSHA1 As New System.Security.Cryptography.SHA1CryptoServiceProvider
Dim bValue() As Byte
Dim bHash() As Byte

bValue = System.Text.Encoding.UTF8.GetBytes(sPlainTextPass)
bHash = oSHA1.ComputeHash(bValue)
oSHA1.Clear()

Dim sEncryptPass As String = String.Empty
For i As Integer = 0 To bHash.Length - 1
    sEncryptPass = sEncryptPass + bHash(i).ToString("x2").ToLower()
Next

一些补充说明:盐存储在数据库中. sPlainTextPass包含纯文本密码salt.我尝试了几种不同的编码,包括ASCII,UTF7和UTF8.数据库字段是一个varchar,应该根据我的理解与UTF8匹配.

救命?

最佳答案 你不能哈希一个字符串,你只能哈希字节.因此,SQL Server和您必须使用编码将字符串转换为字节.

SQL Server不支持UTF8.您需要找出它的用途并在您的应用程序中匹配该编码.对于nvarchar,我会尝试使用Encoding.Unicode并使用稀有和特殊字符对其进行测试.

网上似乎有一些关于这个主题的信息,我发现谷歌搜索“hashbytes编码”:http://weblogs.sqlteam.com/mladenp/archive/2009/04/28/Comparing-SQL-Server-HASHBYTES-function-and-.Net-hashing.aspx虽然我必须说博客文章包含明显的错误,不能被信任.

点赞