長話短說,我有一些密碼在 PHP 版本中被不正確地加鹽和散列,如果加鹽無效,允許 crypt() 函數回退到 CRYPT_STD_DES 算法。然而在 PHP 5.3.2+ 中:5.3.2 修正了 Blowfish 在無效回合上返回“失敗”字符串(“*0”或“*1”)而不是回退到 DES 的行為。造成這個問題的原因是鹽中包含“$”字符,因為它本來是一種河豚鹽(但在不知不覺中變形了)。因此,我無法手動執行以下操作: crypt($pass, "$a"); 因為那現在也不是有效的 CRYPT_STD_DES 鹽。鹽必須在“./0-9A-Za-z”范圍內。它只是按照 PHP 開發人員的預期返回“*0”。如何在較新版本的 PHP(理想情況下至少為 7.1)中驗證這些格式錯誤的密碼?
3 回答

qq_花開花謝_0
TA貢獻1835條經驗 獲得超7個贊
作為一種解決方法,我最終實際上將舊版本的 PHP 用于單個目錄,我可以在其中調用file_get_contents()
并使用舊的(錯誤的)算法檢索哈希,但在其他地方仍然使用更現代的 PHP 版本。
然而,這不是一個合適的解決方案,因為它在技術上沒有回答這個問題: “我如何在更新版本的 PHP 中驗證這些格式錯誤的密碼?”
因此,除非似乎沒有其他可能的解決方案,否則我不會將此標記為已接受的答案(但我認為為了完整性起見應該添加此答案)。

滄海一幻覺
TA貢獻1824條經驗 獲得超5個贊
找到了一個實際的解決方案。通過強制加鹽,事實證明 PHP 將無效的“$2”STD_DES 加鹽解釋為“q2”。
因此,這個問題的答案是可以在較新版本的 PHP 中驗證這些散列,方法是更改用于比較散列的鹽,使其以“q2”而不是“$2”開頭。從那里開始,可以substr_replace($str, '$', 0, 1);
在執行相等性檢查時調用將新添加的“q”字符替換回“$”字符。
作為一個軼事,顯然我得到的信息是不正確的,并且哈希值是在 PHP 5.3.29 中生成的,這與文檔所說的退回到在版本 5.3.2 中修補的 STD_DES 相矛盾。

MM們
TA貢獻1886條經驗 獲得超2個贊
你可能正在尋找
password_hash?(?string?$password?,?int?$algo?[,?array?$options?]?)?:?string
- 3 回答
- 0 關注
- 123 瀏覽
添加回答
舉報
0/150
提交
取消