对于我的登录页面,我打算使用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')
答案 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')