如果您想確保使用 sodium_crypto_pwhash_str 產生的雜湊值與 password_hash 產生的雜湊值相容,您需要注意記憶體設定。根據文件,password_hash 的 memory_cost 參數是以「kibibytes」給定的,而 sodium_crypto_pwhash_str 使用位元組。我做了一些實驗來看看差異,結果遇到這個問題
echo password_hash('password',
PASSWORD_ARGON2ID,
[
'memory_cost' => 15000,
'time_cost' => 26,
'threads' => 1,
];
echo sodium_crypto_pwhash_str(
'password', 26,
15000000);
這些結果是
$argon2id$v=19$m=15000,t=26,p=1$VG5MSkhUdEdFaGwyVG5sWA$laRHogIVAnC4ggLI8RdCDWlITTdicrdq0tK6SHGf4CI
$argon2id$v=19$m=14648,t=26,p=1$ClQ37/z9u7K6V1C2bkD4QA$51m8KhQQ9gujFSF+JyQR9d5QesayJiKsFmDU4HnGBHg
請注意,「m=」的數字不同,而且也與我們要求的不同。這是因為使用了「kibibytes」單位。如果我們將 password_hash 使用的 15000 乘以 1,024 而不是 1,000,我們會得到 15,360,000,而使用這個數字會給我們預期的雜湊參數
echo sodium_crypto_pwhash_str(
'password', 26,
15360000);
$argon2id$v=19$m=15000,t=26,p=1$Qz3pWktOvT6X/LvdAk0bgQ$KosSFPfHUtWg+ppyRs3Op5/zIV6F6iy2Q7Gom8wP29c
這應該與 password_hash 相容。
順便一提,我用於 Argon2id 雜湊參數的數字取自 OWASP 密碼指南,該指南建議的值與 PHP 的預設值不同:https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#argon2id