【问题标题】:Password does not match with hash algorithm (SQL Server)密码与哈希算法不匹配(SQL Server)
【发布时间】:2011-02-05 11:28:25
【问题描述】:

我遇到了 SQL Server 问题。我的任务是用 PHP 实现一个简单的基于 SQL Server 的用户系统。这些数据库也被 MMORPG 使用,所以我不能更改数据库结构或散列算法。我的问题的真正原因是,密码是由以下算法散列的

HashBytes('MD5', REVERSE(UPPER(@ID)) + @PW)

I created a test user called test123 and pw hallo123 what conforms the password hash "0x7CEE495091E11FF9560D3D01651333220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"

到目前为止,一切都应该清楚了。好吧,但是当我尝试通过查询获取数据时,我没有得到任何结果。我运行了这个查询:

mssql_query("SELECT * FROM [DB_Member].[dbo].[Member] WHERE ID = 'test123' AND PW = HashBytes('MD5', REVERSE(UPPER('test123')) + 'hallo123')");

不返回任何结果。但是如果我直接运行这个查询

mssql_query("SELECT * FROM [DB_Member].[dbo].[Member] WHERE ID = 'test123' AND PW = 0x7CEE495091E11FF9560D3D01651333220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);

我得到数据没有任何问题

我现在正在努力解决这个问题大约八个小时,但我无法弄清楚问题所在。

【问题讨论】:

    标签: php sql-server passwords password-hash


    【解决方案1】:

    我认为您需要仔细查看您的数据类型。我的猜测是变量@ID 和@PW 是生成哈希的char 数据类型。当您尝试查询时,插入“test123”和“hallo123”,您需要在之后添加空格,以便它们匹配它们在创建哈希的例程中的任何 char(?) 数据类型。

    这是一个示例,说明使用 char 和 varchar 数据类型的区别。

    使用字符

    declare @PW char(25)
    declare @ID char(25)
    
    set @PW = 'hallo123'
    set @ID = 'test123'
    
    select (HashBytes('MD5', REVERSE(UPPER(@ID)) + @PW))
    

    哈希结果

    0x9F1E0132F198216841E2608901D27115
    

    使用 varchar

    declare @PW varchar(25)
    declare @ID varchar(25)
    
    set @PW = 'hallo123'
    set @ID = 'test123'
    
    select (HashBytes('MD5', REVERSE(UPPER(@ID)) + @PW))
    

    哈希结果

    0x870B01D196916AFA88EBC900BE5395BE
    

    哈希显然不匹配。

    散列后有一堆零的原因是散列存储在二进制(60)字段中。 HashBytes 返回 VarBinary 但这不是查询失败的原因。在比较二进制与 VarBinary 时,SQL Server 会进行某种类型的转换。

    【讨论】:

    • 很好的答案,谢谢!有没有办法完全按照服务器接收查询的方式查看查询?然后我可以看到正在生成哪个哈希。谢谢
    • @Thomas - 您可以使用 SQL Server Profiler 查看设置密码时发送到服务器的内容。设置跟踪并在更改密码之前启动它,然后尽快将其关闭。然后您需要通读日志并查找更改密码的语句并查看参数包含的内容。我给出的例子是它们用空格填充。他们很可能用其他东西填充。
    【解决方案2】:

    是否有可能您使用的任何语言都对其进行了奇怪的编码?如果您启动 SQL 分析器并查看发送的查询以查看是否可以发现差异,该怎么办?

    【讨论】:

      【解决方案3】:

      当我运行SELECT HashBytes('MD5', REVERSE(UPPER('test123')) + 'hallo123') 时,我得到的结果是 0x870B01D196916AFA88EBC900BE5395BE。您确定您的哈希创建是正确的,并且您在创建测试用户时使用了正确的 ID 和密码吗?

      【讨论】:

        猜你喜欢
        • 2013-05-19
        • 1970-01-01
        • 2015-04-05
        • 1970-01-01
        • 1970-01-01
        • 2018-01-17
        • 2011-10-10
        • 2012-07-05
        • 2016-08-27
        相关资源
        最近更新 更多