8

我们将密码哈希存储在数据库中。基本上我们得到 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

有任何想法吗?

4

2 回答 2

5

呃!找到了。当我重读我的帖子时,我意识到在我的示例中我使用的是转换为 VARCHAR,而不是 NVARCHAR。一旦我将它更改为 NVARCHAR ,它就开始工作了。

于 2012-07-12T12:40:42.007 回答
0

您可以使用

   select CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX),FileBytes)) 

   FileBytes=0x3C3F786D6C207665
于 2016-05-10T09:55:24.087 回答