如果您想确保使用 sodium_crypto_pwhash_str 生成的哈希值与 password_hash 生成的哈希值兼容,则需要注意内存设置。根据文档,password_hash 的 memory_cost 参数以“KiB”(千字节)为单位,而 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=” 的数值不同,也与我们要求的不同。这是由于“KiB”单位造成的。如果我们将 password_hash 使用的 15000 乘以 1024 而不是 1000,我们将得到 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