SQL MD5哈希函数向其他人返回不同的结果,例如passwordsgenerator.net/md5-hash-generator
首先,我随机选择一个源字符串,在这种情况下为:
спасибо(:
用我的源字符串提供Miracle Salad MD5生成器将返回以下结果:
e1295bb206823340c694b795c17eb4c5
我用来在SQL Server中生成MD5哈希的查询如下:
SELECT CONVERT(VARCHAR(32), HASHBYTES('md5', 'спасибо(:'), 2)
...返回以下结果:
C4E6F99E8CD676020DC7D3E13612D51A
请有人帮助我找出a)它们为什么不同,以及b)将返回与passwordsgenerator.net相同结果的Sql查询吗?
答案 0 :(得分:2)
说明
一种可能的解释是,此在线工具计算了MD5
编码字符串的UTF8
哈希。我可以使用PHP
和T-SQL
重现此行为。
可能的解决方案是:
在您的应用程序中将UTF-8
文本转换为cyrillic
文本,然后使用HASHBYTES
使用类似ToUTF的功能将cyrillic
文本编码为数据库中的UTF-8
。我仅将此功能用于测试,但建议在您的应用程序中进行转换。
测试,使用PHP并从UTF8转换为CP1251
PHP:
<?php
$input = "спасибо(:";
$input = iconv("UTF8", "CP1251", $input);
echo md5($input);
?>
T-SQL:
DECLARE @input varchar(32) = 'спасибо(:'
SELECT CONVERT(varchar(32), HASHBYTES('md5', @input), 2)
输出:
C4E6F99E8CD676020DC7D3E13612D51A
使用在线生成器和UDF测试
T-SQL:
DECLARE @input varchar(32) = 'спасибо(:'
SELECT CONVERT(VARCHAR(32), HASHBYTES('md5', dbo.ToUTF8(@input)), 2)
输出:
E1295BB206823340C694B795C17EB4C5
注释
测试数据库的默认排序规则为Cyrillic_General_CS_AS
。
答案 1 :(得分:1)
此输出
select CONVERT(NVARCHAR(64),HASHBYTES('md5','спасибо(:'),2), HASHBYTES('md5','спасибо(:')
是
6010E112D213366938E6C894F1BE9C2A 0x6010E112D213366938E6C894F1BE9C2A
因此该函数的输出包括'0x',请参见How can I get a SQL Server md5 hash to match a previous php md5 hash?