我目前正在設置一個臨時環境,在該環境下,我遇到了PHP crypt()
的問題。我們使用相同的數據將相同的代碼部署到相同的環境中(Ubuntu 14.04,Apache 2.2.25,PHP 5.4.17,mySQL 5.6.11,由相同的安裝腳本設置的所有內容),但我們無法登錄進入我們的平臺。密碼使用crypt()
如下散列:crypt():儘管PHP環境相同,但在不同服務器上的行爲不同
$saltedPassword = $userSalt . $userInput . $systemSalt;
$randomSalt = someFunctionWithMtRandOutputting22Chars();
$hash = crypt($saltedPassword, '$2y$15$' . $randomSalt);
$userDao->storePassword($hash);
$userSalt
是常數日期與用戶(像他ID)並列,$userInput
IST從前端發送的實際口令。示例散列將是$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
。雖然密碼的salt部分是相同的(並且表明選擇了正確的算法[Blowfish]),但第二部分與存儲的哈希不同。
我測試了所有系統上的已知常量(CRYPT_SALT_LENGTH
和CRYPT_BLOWFISH
),並且所有值都相同。我在命令行上測試了代碼,所有系統都返回了相同的散列,但令人驚訝的是,它不是存儲在數據庫中的散列,而是「錯誤的」散列。這可能是錯誤配置的提示嗎?
現有工作環境與新的故障舞臺環境之間唯一已知的區別是舞臺環境在我們的測試服務器上設置爲chroot
環境。這種差異可能是我的問題的原因?