【发布时间】:2012-06-27 19:13:17
【问题描述】:
在使用 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 包含纯文本的密码+盐。我尝试了几种不同的编码,包括 ASCII、UTF7 和 UTF8。数据库字段是一个 varchar,据我了解,它应该与 UTF8 匹配。
帮助?
【问题讨论】:
-
请不要使用单次迭代 SHA1 进行密码散列。使用 PBKDF2、bcrypt 或 scrypt。
-
你为什么要在数据库中散列?我会在应用程序中进行所有哈希处理。
-
sPlainTextPass 包含什么?顾名思义,纯密码?在这种情况下,问题很明显:您需要在哈希中包含盐。
-
所以基本上:您需要确保散列相同的值(以字节为单位),并且输出的编码类似。因此,您需要使用相同的(字符)编码同时输入密码和盐。
-
编辑了原始消息以回答几个问题 Faber 和 owlstead,因为我意识到他们对原始问题很重要。
标签: .net sql vb.net cryptography sha1