密码与哈希算法(SQL Server)不匹配

时间:2011-02-05 11:28:25

标签: php sql-server passwords password-hash

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

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

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

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

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

我没有任何问题地获取数据

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

3 个答案:

答案 0 :(得分:1)

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

以下示例说明了使用char和varchar数据类型的不同之处。

使用char

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

答案 1 :(得分:0)

您使用的语言是否可能奇怪地编码?如果您启动SQL事件探查器并查看正在发送的查询以查看是否可以发现差异,该怎么办?

答案 2 :(得分:0)

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