如果您想确保使用 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