SQL从VARCHAR中获取字节而不转换为UNICODE

我们在数据库中存储密码哈希。 基本上我们得到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中,它会跳过'并放入其他字符。 再次,probalby试图插入一个不完整的UNICODE序列,因为它不是一个合适的UNICODE字符串。

所以我正在寻找的是一种简单地获取包含密码哈希的VARCHAR(64)中的字节并将其写入编码文本格式的方法,如下所示:

0x0F037584C99E7FD4F4F8C59550F8F507

这样我就可以做类似的事情了

UPDATE   [User]
SET      PasswordHash = CONVERT(NVARCHAR(64), 0x0F037584C99E7FD4F4F8C59550F8F507)
WHERE    UserID = 123

有任何想法吗?


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


您可以使用

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

   FileBytes=0x3C3F786D6C207665
链接地址: http://www.djcxy.com/p/61555.html

上一篇: SQL Get bytes out of VARCHAR without converting to UNICODE

下一篇: Visitor Pattern for AST