我们将密码哈希存储在数据库中。基本上我们得到 MD5 哈希(字节数组),然后在字节数组上运行 Encoding.Unicode.GetChars 并将生成的字符串存储在数据库中。然后当有人登录时,我们以相同的方式散列他们的密码并比较两个字符串。
这很好用,除了我无法在 T-SQL 中提取密码哈希并将其插入另一行。我可以让它工作的唯一方法是,如果我实际上直接从选择的具有有效哈希的另一行中设置密码哈希。
我试图将字符串转换为十六进制并让 SQL 转换它,但这也不起作用。我认为这是因为我们编码为 UNICODE 的字节可能不构成有效的 UNICODE 字符串。
例如(SQL Server:将字符串转换为十六进制字符串并返回):
当您运行以下命令时,“Help”这个词会被转换为 var binary,然后再转换为字符串,嘿嘿!你最终再次得到“帮助”。
SELECT CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), 'Help'))
问题是当我在密码哈希列上运行它时,结果值与存储在列中的值不同。如果我将包含哈希的字符串粘贴到两个 ' 符号之间的 SQL Management Studio 中,它会跳过 ' 并放入一些其他字符。同样,很可能试图解释一个不完整的 UNICODE 序列,因为它不是一个正确的 UNICODE 字符串。
所以我正在寻找一种方法来简单地获取包含密码哈希的 VARCHAR(64) 中的字节并将其写入编码文本格式,例如:
0x0F037584C99E7FD4F4F8C59550F8F507
这样我就可以做类似的事情
UPDATE [User]
SET PasswordHash = CONVERT(NVARCHAR(64), 0x0F037584C99E7FD4F4F8C59550F8F507)
WHERE UserID = 123
有任何想法吗?