crypt():尽管PHP环境相同,但不同服务器上的行为不同

crypt():尽管PHP环境相同,但不同服务器上的行为不同,php,hash,crypt,Php,Hash,Crypt,我目前正在设置一个登台环境,在这个环境中,我遇到了PHPcrypt()的问题。我们将相同的代码和相同的数据部署到相同的环境中(Ubuntu 14.04、Apache 2.2.25、PHP 5.4.17、mySQL 5.6.11,所有设置都是通过相同的设置脚本进行的),但我们无法登录到我们的平台。使用crypt()对密码进行哈希处理,如下所示: $saltedPassword = $userSalt . $userInput . $systemSalt; $randomSalt = someFun

我目前正在设置一个登台环境,在这个环境中,我遇到了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$X8oznerdv1su1wdtdaw7josx7kditp3bp0quoucys6zxkaq6dgq
。虽然密码的salt部分是相同的(并表明选择了正确的算法[Blowfish]),但第二部分与存储的哈希不同

我在所有系统上测试了已知常数(
CRYPT\u SALT\u LENGTH
CRYPT\u BLOWFISH
),所有值都相同。我在命令行上测试了代码,所有系统都返回了相同的哈希值,但令人惊讶的是,不是存储在数据库中的哈希值,而是“错误”的哈希值。这可能是一个错误配置的暗示吗


现有工作环境与新的故障阶段环境之间唯一已知的区别是,阶段环境在我们的测试服务器上设置为
chroot
环境。这种差异可能是我的问题的原因吗?

我发现了问题:我的假设,即舞台环境中的数据是相同的,是错误的。在爬过一些测试数据之后,我们发现
$userSalt
在结构上与其他系统不同,这表明数据库设置例程中存在错误