SQL Server中的HashBytes函数(错误的MD5结果)

时间:2014-05-11 11:07:22

标签: sql-server hash md5

我遇到了SQL Server函数HashBytes的一个奇怪问题。

我的Password表(Users)中有一列nvarchar(32), not null

用户的密码为123456,在MD5中为e10adc3949ba59abbe56e057f20f883e,此值存储在列中。

我正在尝试获取e10adc3949ba59abbe56e057f20f883e的MD5哈希函数,实际上是14e1b600b1fd579f47433b88e8d85291(您可以检查它here),但是在我的SQL Server查询中,我得到了另一个结果:

SELECT TOP 1
   Password,
   lower(convert(nvarchar(32), HashBytes('MD5', '123456'), 2)) AS md5pass1,
   lower(convert(nvarchar(32), HashBytes('MD5', 'e10adc3949ba59abbe56e057f20f883e'), 2)) AS md5pass2,
   lower(convert(nvarchar(32), HashBytes('MD5',  Password), 2)) AS md5pass3
FROM Users

结果是:

enter image description here

我希望得到' 14e1b600b1fd579f47433b88e8d85291'结果......

感谢你帮助我!

2 个答案:

答案 0 :(得分:4)

你不能哈希文本,你只能哈希字节。 HashBytes首先将输入字符串转换为字节。转换取决于数据类型是否为Unicode类型。我想Passwordnvarchar,我发现你的文字是varchar

决定你想要哪一个并持续使用它。

答案 1 :(得分:0)

根本原因是您使用的nvarchar是unicode。转换为非unicode varchar后,获取正确的结果。由于它的密码,为什么不直接使用varchar。