如何为提供的密码和salt复制密码哈希(PHP / MySQL)

时间:2011-11-05 19:56:28

标签: php mysql sql-server password-hash

密码需要与密码哈希匹配,密码哈希最初是在.NET平台上创建的并存储在MSSQL上(因此加密可能是SHA1)。

以下是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 第二位用户:sunny / eclyptix

请帮忙!

2 个答案:

答案 0 :(得分:0)

看起来你有编码问题:

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

您的原始代码似乎已损坏,并且正在将字符从可打印的ASCII范围转换为问号。

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

答案 1 :(得分:0)

Kevin Bruce(来自您引用的第二个例子)。

对于它的价值,我从来没有用我的经验解决问题。我实际上与伊丽莎白·史密斯(曾为Windows的PHP核心工作)进行了交谈,她同意由于PHP中的字符编码支持,与.NET相同的哈希支持存在很大的脱节。这是我怀疑的。