MD5哈希不匹配

时间:2011-06-10 08:05:16

标签: php sql md5

我正在尝试将md5(通过php生成)与SQLExpress数据库中的原始值相匹配。

我在SQL查询中使用以下函数

master.sys.fn_varbintohexsubstring(0, HASHBYTES('MD5', 'ID'), 1, 0)

其中'ID'是数据库中的字段。

然而,它们似乎都为md5哈希返回不同的值。我一直使用'12290'作为静态值来测试它。

php md5()返回:0bd81786a8ec6ae9b22cbb3cb4d88179

以下SQL语句返回相同的输出:

DECLARE @password VARCHAR(255)
SET @password = master.sys.fn_varbintohexsubstring(0, HASHBYTES('MD5', '12290'), 1, 0)
SELECT @password

然而,当我从表中运行以下语句时:

SELECT ID,  master.sys.fn_varbintohexsubstring(0, HASHBYTES('MD5', CONVERT(NVARCHAR(255), ID)), 1, 0) AS temp
FROM Clients
ORDER BY ID ASC

与'ID'值12290匹配的'temp'值返回:1867dce5f1ee1ddb46ff0ccd1fc58e03

非常感谢任何有关此事的帮助!

由于

3 个答案:

答案 0 :(得分:3)

Python帮助我帮助你。

>>> from hashlib import md5
>>> md5('1\x002\x002\x009\x000\x00').digest().encode('hex')
'1867dce5f1ee1ddb46ff0ccd1fc58e03'

NVARCHAR是Unicode类型,从上面的实验看,'12990'在您的数据库中存储为UTF-16LE:'1\02\09\09\00\0'

假设PHP中的数据编码是UTF-8数据而您不想更改数据库中的现有数据,那么就可以修改PHP脚本:

<?php
    $password = '12290';
    $hash = md5(mb_convert_encoding($password, 'UTF-16LE', 'UTF-8')) . "\n";
    echo $hash;
?>

输出:

susam@swift:~$ php utf16le-hash.php
1867dce5f1ee1ddb46ff0ccd1fc58e03

如果PHP中的数据采用其他编码(如ASCII,ISO-8859-1等),您可以相应地将第三个参数更改为mb_convert_encoding。所有支持的编码列表位于:http://www.php.net/manual/en/mbstring.supported-encodings.php

另请参阅http://www.php.net/manual/en/function.mb-convert-encoding.php

答案 1 :(得分:0)

两件事之一很可能就是问题:

  1. 该行中的ID列的值不完全等于'12290'(例如额外的空格)
  2. 或者CONVERT函数产生这样的值
  3. 在任何情况下,标准调试方法都是使用SQL查询来选择该ID字段的字符串长度和CONVERT的返回值;如果其中任何一个不等于5,则表示您发现错误。

    或者,您可以执行包含数据的表的转储,并查看生成的INSERT语句,以查看数据库中该列的值是什么。

答案 2 :(得分:0)

我没有SQL服务器来测试它,但CONVERT命令可能正在创建具有240多个尾随空白的NVARCHAR(因为您指定了NVARCHAR(255))

尝试将NVARCHAR设置为要测试的ID的长度:

ARE @password VARCHAR(255)
SET @password = master.sys.fn_varbintohexsubstring(0, HASHBYTES('MD5', CONVERT(NVARCHAR(5), '12290')), 1, 0)
SELECT @password

在CONVERT中尝试不同的长度 - 有什么区别吗?