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

Tyr*_*erk 7 t-sql

我们在数据库中存储密码哈希.基本上我们得到MD5哈希(字节数组),然后在字节数组上运行Encoding.Unicode.GetChars并将结果字符串存储在数据库中.然后,当有人登录时,我们以相同的方式散列密码并比较两个字符串.

这很好用,除了我无法在T-SQL中提取密码哈希并将其插入另一行.我可以实现的唯一方法是,如果我实际上直接从具有有效散列的另一行的选择中设置密码散列.

我试图将字符串转换为十六进制并让SQL转换它,但这也不起作用.我假设这是因为我们编码为UNICODE的字节可能不构成有效的UNICODE字符串.

例如(SQL Server:将字符串转换为十六进制字符串并返回):

当您运行以下命令时,"帮助"一词将转换为var二进制文件,然后返回到一个字符串,嘿presto!您最终会再次使用"帮助".

SELECT CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), 'Help'))
Run Code Online (Sandbox Code Playgroud)

问题是,当我在密码哈希列上运行时,结果值与列中存储的值不同.如果我将包含哈希的字符串粘贴到两个'符号之间的SQL Management Studio中,它会跳过'并放入其他一些字符.再次,probalby试图插入一个不完整的UNICODE序列,因为它不是一个合适的UNICODE字符串.

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

0x0F037584C99E7FD4F4F8C59550F8F507
Run Code Online (Sandbox Code Playgroud)

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

UPDATE   [User]
SET      PasswordHash = CONVERT(NVARCHAR(64), 0x0F037584C99E7FD4F4F8C59550F8F507)
WHERE    UserID = 123
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Tyr*_*erk 5

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