【问题标题】:MD5 Hashing in SQL ServerSQL Server 中的 MD5 哈希
【发布时间】:2019-06-11 03:50:24
【问题描述】:

SQL MD5 散列函数向其他函数返回不同的结果,例如passwordsgenerator.net/md5-hash-generator

首先我随机选择一个源字符串,在本例中是:

спасибо(:

使用我的源字符串提供 Miracle Salad MD5 生成器返回以下结果:

e1295bb206823340c694b795c17eb4c5

我在SQL Server中用来生成MD5哈希的查询如下:

SELECT CONVERT(VARCHAR(32), HASHBYTES('md5', 'спасибо(:'), 2)

...返回以下结果:

C4E6F99E8CD676020DC7D3E13612D51A

请有人帮我弄清楚 a) 为什么它们不同,b) 一个 Sql 查询将返回与 passwordsgenerator.net 相同的结果?

【问题讨论】:

  • 我认为 passwordgenerator.net 是错误的。文本 'tést' 有 md5 'AB176F76FEC779A347D4096384EDB094',在 mssql 中它说 '147ACB11180BB723C38841D4845E207D' 。尝试转换“测试”时,两者都给出相同的结果!
  • 该网站是正确的,它给出了正确的结果,我尝试了很多次。
  • 好的,网站似乎还可以。
  • @alex-sh passwordsgenerator.net/md5-hash-generator 使用 utf-8 编码字符串计算 md5 和。你如何在你的应用程序中使用这个生成器?

标签: sql-server


【解决方案1】:

说明

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

【讨论】:

  • 请您包含您的 dbo.ToUTF8 函数的列表吗?我搜索了一下,找到了一些,但是输出返回 6010E112D213366938E6C894F1BE9C2A
  • @Knickerless-Noggins 有一个链接就是答案。谢谢。
  • 我仍然得到 6010E112D213366938E6C894F1BE9C2A。你能仔细检查一下吗?
  • @Knickerless-Noggins 因为它是西里尔文字,所以我的测试数据库排序规则是Cyrillic_General_CS_AS。使用服务器默认排序规则,输出为6010E112D213366938E6C894F1BE9C2A
  • 呼,我终于到了。 DECLARE @input NVARCHAR(MAX) = dbo.ToUTF8(N'спасибо(:');SELECT CONVERT(NVARCHAR(32), HASHBYTES('md5', @input COLLATE Cyrillic_General_CI_AI), 2) 有效。谢谢你的帮助,佐罗夫。
【解决方案2】:

这个的输出

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?

【讨论】:

  • 输出不带0x
猜你喜欢
  • 1970-01-01
  • 2016-06-24
  • 2018-09-18
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
相关资源
最近更新 更多