我目前正在设置一个暂存环境,我遇到了PHP crypt()
的问题。我们将具有相同数据的相同代码部署到同一环境中( Ubuntu 14.04,Apache 2.2.25,PHP 5.4.17,mySQL 5.6.11 ,所有内容都由相同的安装脚本设置),但是我们无法登录我们的平台。密码使用crypt()
进行哈希处理,如下所示:
$saltedPassword = $userSalt . $userInput . $systemSalt;
$randomSalt = someFunctionWithMtRandOutputting22Chars();
$hash = crypt($saltedPassword, '$2y$15$' . $randomSalt);
$userDao->storePassword($hash);
$userSalt
是与用户绑定的固定日期(如他的ID),$userInput
是从前端发送的实际密码。示例哈希值为$2y$15$X8ozNErDV1SU1wdTdAW7JOg/eYt4C7okLB0.9pR9HkM.fqtj7/H.e
。
要登录,门户网站使用以下代码:
$hash = $userDao->getPassword();
$saltedPassword = $userSalt . $userInput . $systemSalt;
$authorized = (crypt($saltedPassword, $hash) === $encryptedPassword);
// if $authorized === true, login
此代码在5台不同的机器(生产和开发)上完美运行。在舞台环境中使用相同的代码时,第二个crypt()
调用会返回不同的结果,在本例中为$2y$15$X8ozNErDV1SU1wdTdAW7JOsxs7kdiTp3Bp0QuuOUcYs6zXkaq6dgq
。虽然密码的盐部分是相同的(并且表明选择了正确的算法[Blowfish]),但第二部分与存储的哈希不同。
我在所有系统上测试了已知常量(CRYPT_SALT_LENGTH
和CRYPT_BLOWFISH
),并且所有值都相同。我在命令行上测试了代码,并且所有系统都返回了相同的哈希值,但令人惊讶的是没有存储在数据库中的哈希值,而是"错误的"一。这可能是错误配置的暗示吗?
现有的工作环境与新的故障阶段环境之间唯一已知的区别是,舞台环境在我们的测试服务器上设置为chroot
环境。这种差异可能是我问题的原因吗?
答案 0 :(得分:0)
我发现了问题:我的假设是,舞台环境中的数据是相同的,是错误的。在浏览一些测试数据后,我们发现$userSalt
在结构上与其他系统不同,表明数据库设置例程中存在错误。