【问题标题】:How to replicate password hash for provided password and salt (PHP/MySQL)如何为提供的密码和盐(PHP / MySQL)复制密码哈希
【发布时间】:2011-11-05 19:56:27
【问题描述】:

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

请帮忙!

【问题讨论】:

    标签: php mysql sql-server password-hash


    【解决方案1】:

    您的编码似乎有问题:

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

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

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

    【讨论】:

    • 谢谢你的回答马克,我同意你的看法。但是,我需要尽可能地完成这项工作,因为我们有一个拥有大量用户的旧数据库。这就是它们最初存储在 SQL Server 2008 数据库中的方式(我会说它们以二进制格式存储),我们需要将它们复制到 MySQL 数据库中并使其与 PHP 一起使用。从那时起,我们可以将它们编码为 HEX 字符串并进行改进。
    • @crazyhorse:如果幸运的话,数据在 SQL Server 中正确存储,而您只是导出/导入不正确。
    • 不幸的是,在 SQL Server 生产服务器上也是如此。
    【解决方案2】:

    这里是凯文布鲁斯(来自您引用的第二个示例)。

    不管怎样,我的经验从来没有解决过这个问题。实际上,我与 Elizabeth Smith(从事 Windows 的 PHP 核心工作)进行了交谈,她同意由于 PHP 中的字符编码支持,与 .NET 相同级别的哈希支持存在很大的脱节。这是我怀疑的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      • 2010-09-28
      相关资源
      最近更新 更多