当对预定义变量使用master.sys.fn_varbintohexstr函数时,HASHBYTES返回不同的结果

时间:2019-01-22 21:55:37

标签: sql sql-server sql-server-2014

对于我的登录页面,我打算使用master.sys.fn_varbintohexstr保存密码并进行比较。但是我注意到一个有趣的不匹配问题,它迫使我使用CONVERT来varchar函数。请参阅下面的查询。

--NOT MATCHING
DECLARE @Salt varchar(max);
SET @Salt = master.sys.fn_varbintohexstr(HASHBYTES('MD5', 'eray@yahoo.com'));

Select [Password] = HASHBYTES('SHA2_256', master.sys.fn_varbintohexstr(HASHBYTES('MD5', 'eray@yahoo.com'))  + 'mypassword#2')
Select [Password] = HASHBYTES('SHA2_256', @Salt  + 'mypassword#2')

上面返回的结果集是::

0x0A514606045942EDD38C5C8B84EE3353D82834125094CDE2C7D116931B22CABD
0xE94F936A8502CCA5CF8885738C5ECF8BBF7CB128F3525AAB172B1C03E634BD32

可以看到,它们并不相同,但是我希望它们完全相同。是什么原因呢?为什么会发生以及如何解决?我现在正使用下面的方法来解决此问题,但是我不知道如何正确使用master.sys.fn_varbintohexstr函数本身?任何提示将不胜感激!谢谢!

--MATCHING (both select here returns same)
DECLARE @Salt varchar(max);
SET @Salt = CONVERT(VARCHAR(34), HASHBYTES('MD5', 'eray@yahoo.com'), 1);

Select [Password] = HASHBYTES('SHA2_256', CONVERT(VARCHAR(34), HASHBYTES('MD5', 'eray@yahoo.com'), 1)  + 'mypassword#2')
Select [Password] = HASHBYTES('SHA2_256', @Salt  + 'mypassword#2')

1 个答案:

答案 0 :(得分:1)

找不到原因1个小时,但在此处发布此问题后的5分钟内找到了原因。这就是SO的精神力量:)

无论如何,我只需要在开头声明@Salt为nvarchar,而不是像下面的varchar

DECLARE @Salt nvarchar(max);
SET @Salt = master.sys.fn_varbintohexstr(HASHBYTES('MD5', 'eray@yahoo.com'));

Select [Password] = HASHBYTES('SHA2_256', master.sys.fn_varbintohexstr(HASHBYTES('MD5', 'eray@yahoo.com'))  + 'mypassword#2')
Select [Password] = HASHBYTES('SHA2_256', @Salt  + 'mypassword#2')
相关问题