0

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

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

我创建了一个名为 test123 和 pw hallo123 的测试用户,它符合密码哈希“0x7CEE495091E11FF9560D3D01651333220000000000000000000000000000000000000000000000000000000000000000000000000000”

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

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);

我得到数据没有任何问题

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

4

3 回答 3

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 会进行某种转换。

于 2011-02-05T22:37:07.660 回答
0

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

于 2011-02-05T14:20:03.183 回答
0

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

于 2011-02-05T14:20:22.540 回答