我有一个SQL Server2014表格,里面填满了由php使用php $hash = md5($password);命令生成的MD5散列。现在,我们将转向更严格的安全模型,我希望能够在存储过程中获取一个密码,并将其与先前存储的md5散列进行匹配。
当SQL返回的md5散列与php返回的散列不同时,问题就出现了。
当我使用
SELECT username,
[password],
master.sys.fn_varbintohexsubstring(0, HASHBYTES('MD5', CONVERT(VARCHAR(32), [password])), 1, 0) AS Test,
HASHBYTES('MD5', [password]) AS MD5
FROM myTable
WHERE username=@username我得到了:
Password = 28d744960521b00fd7c4a9e7e7d4d3a3,
Test = 172b078903f8f16098fea3df31ee8989, and
MD5 = 0x172B078903F8F16098FEA3DF31EE8989MD5表达式是普通的tsql和我在网上得到的Test表达式,但正如您所看到的,它们的结果都不等于我最初从php的md5()表达式中存储的结果。
你知道为什么它们是不同的吗,更好的是,有没有一种方法可以格式化tsql命令,让我匹配存储的php md5值?
发布于 2016-03-10 10:31:36
我很抱歉!我向sql散列序列发送的是值password,而不是输入的变量@password!因此,我在测试和MD5中接收到的是散列的散列,而不是原始密码的散列。
有趣的是,为了获得正确的匹配,需要使用花哨的master.sys.fn_varbintohexsubstring(0, HASHBYTES('MD5', CONVERT(VARCHAR(32), [password])), 1, 0)来删除前导0x。
https://stackoverflow.com/questions/35906413
复制相似问题