2011-11-05 140 views
1

密码需要与最初在.NET平台上创建并存储在MSSQL上的密码哈希值进行匹配(因此加密可能是SHA1)。如何复制提供的密码和salt的密码哈希值(PHP/MySQL)

这里是MySQL表的样子:

CREATE TABLE IF NOT EXISTS `test` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `UserName` varchar(100) COLLATE latin1_general_ci DEFAULT NULL, 
    `PasswordHash` varchar(100) CHARACTER SET utf8 DEFAULT NULL, 
    `PasswordSalt` int(10) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=12535 ; 

-- 
-- Dumping data for table `test` 
-- 

INSERT INTO `test` (`id`, `UserName`, `PasswordHash`, `PasswordSalt`) VALUES(9836, 'demoadmin', '?z1??9t|????e&??9aK', -1190254076); 
INSERT INTO `test` (`id`, `UserName`, `PasswordHash`, `PasswordSalt`) VALUES(12534, 'sunny', '??o\\(R?8~??6>?t????o', 549612932); 

我发现两个到我需要做的事情非常接近的例子,但我还是能够使它发挥作用。

例1:http://gilbert.pellegrom.me/replicating-net-password-hashing-in-php/

例2:http://www.kevinbruce.com/Blog?area_id=6&blog_id=3&ba_id=27

用户名和密码是:

首先用户:demoadmin/demotest 其次用户:晴天/ eclyptix

请帮帮忙!

回答

0

它看起来就像你有一个编码的问题:

'?z1??9t|????e&??9aK' 

看来你的原代码被打破,并转换角色了可打印的ASCII范围内的成问号。

可能尝试在PHP中复制此行为。然而,继续使用这个破碎的方案会危及你的系统的安全性,因为它更有可能发现散列冲突。可能需要让所有用户更改密码。这次确保哈希正确存储。您也可以考虑将它们存储为十六进制字符串而不是二进制数据,以最大限度地减少进一步编码问题的风险。

+0

感谢您的回答马克,我同意你的意见。但是,如果可能的话,我需要尽可能地完成这项工作,因为我们有一个拥有大量用户的遗留数据库。 这是他们最初存储在SQL Server 2008数据库(我会说他们存储在一个二进制格式),我们需要将它们复制到MySQL数据库,并使其与PHP的工作。从这一点上,我们可以将它们编码为HEX字符串并改进。 – crazyhorse

+0

@crazyhorse:如果幸运的话,数据已经正确存储在SQL Server中,而您刚刚导出/导入不正确。 –

+0

不幸的是,它在SQL Server生产服务器上的情况也完全相同。 – crazyhorse

0

凯文布鲁斯在这里(从你引用的第二个例子)。

对于它的价值,我从来没有用我的经验解决问题。我实际上与伊丽莎白史密斯(Elizabeth Smith)(她为Windows的PHP核心开发人员)交谈过,她同意由于PHP中的字符编码支持,在与.NET相同级别的哈希支持方面存在很大的脱节。这是我怀疑的。