【问题标题】:HashBytes function in SQL Server (wrong MD5 result)SQL Server 中的 HashBytes 函数(错误的 MD5 结果)
【发布时间】:2014-06-28 19:11:25
【问题描述】:

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

我的Users 表中有一个Password 列(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

结果是:

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

感谢您帮助我!

【问题讨论】:

  • "我正在尝试获取 'e10adc3949ba59abbe56e057f20f883e' 的 MD5 哈希函数,实际上是......" 呃,你为什么要使用 MD5 的 MD5?另外,你为什么要使用 MD5?
  • 嗨,米奇。我需要这个来生成令牌。在我的应用程序中,实际上结果 md5 将包含 3 列(用户 ID + appid + 密码)。我已经检查过 HashBytes(userid+appid) 返回正确的 md5 哈希,但是只有密码 md5 哈希是错误的......
  • 为什么这是错误?你有什么期待?? MD5 是一种 不可逆 哈希算法 - 对 MD5 哈希值应用 MD5 哈希不会返回原始密码.....
  • 我不需要找回密码!我只想得到字符串'e10adc3949ba59abbe56e057f20f883e'的md5哈希,仅此而已
  • 马克,我的期望是得到字符串 'e10adc3949ba59abbe56e057f20f883e' 的 md5 '14e1b600b1fd579f47433b88e8d85291'。

标签: sql-server hash md5


【解决方案1】:

你不能散列文本,你只能散列字节。 HashBytes 首先将输入字符串转换为字节。转换取决于数据类型是否为 Unicode 类型。我猜Passwordnvarchar,我看到你的文字是varchar

确定您想要的并始终如一地使用它。

【讨论】:

  • 谢谢!不知道,你帮了我。 HashBytes('MD5', convert(varchar(32), Password))
【解决方案2】:

根本原因是你使用的nvarchar是unicode。转换为非 unicode varchar 后得到正确的结果。既然是密码,为什么不直接使用varchar呢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多