SQL Server中的MD5哈希

时间:2019-06-10 08:19:19

标签: sql-server

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查询吗?

2 个答案:

答案 0 :(得分:2)

说明

一种可能的解释是,此在线工具计算了MD5编码字符串的UTF8哈希。我可以使用PHPT-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?