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


How to replicate password hash for provided password and salt (PHP/MySQL)

密码需要与最初在。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/elliptix

请帮忙!

看起来你有一个编码问题:

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

似乎你的原始代码被破坏了,并且正在将可打印的ASCII范围之外的字符转换为问号。

可以尝试在PHP中复制此行为。但是,继续使用这种破坏的方案将危及系统的安全性,因为更有可能发现散列冲突。可能有必要让所有用户更改他们的密码。这一次,请确保哈希值被正确存储。您可能还想考虑将它们存储为十六进制字符串而不是二进制数据,以尽量减少进一步编码问题的风险。

Kevin Bruce在这里(来自你引用的第二个例子)。

不管怎样,凭我的经验,我从来没有解决过这个问题。实际上,我和Elizabeth Smith(为Windows开发PHP核心)谈过,她同意由于PHP中的字符编码支持,在与。net相同级别上的哈希支持存在很大的脱节。