我正在尝试将 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
任何有关此事的帮助将不胜感激!
谢谢
最佳答案
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
关于php - MD5 哈希值不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6303624/