php - MD5 哈希值不匹配

标签 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

任何有关此事的帮助将不胜感激!

谢谢

最佳答案

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/

相关文章:

php - 如何反转内容旋转

php - 从数据库表构建 php 嵌套列表

php 根据用户输入生成每月销售报告

sql - 带有包含数字和文本的 varchar 字段的 order 子句

c# - 密码加密-c#

php - 更改表排序规则 LIKE 子句不会返回任何内容

java - 将变量从 Android 客户端发布到 php 服务器时出错

c++ - 在 Visual Studio 2012 中使用 OpenSSL

php - 如何在插入表单 jquery 代码的 div 上运行我的 jquery 代码?

powershell - 从 Windows Azure Blob 存储自动更新 PowerShell 脚本