(PHP 7 >= 7.2.0, PHP 8)
sodium_crypto_pwhash — 使用 Argon2 从密码派生密钥
$length
,$password
,$salt
,$opslimit
,$memlimit
,$algo
= SODIUM_CRYPTO_PWHASH_ALG_DEFAULT
此函数提供对 libsodium 的 crypto_pwhash 密钥派生函数的底层访问。除非您有特定原因使用此函数,否则您应该改为使用 sodium_crypto_pwhash_str() 或 password_hash() 函数。
使用此特定函数的一个常见原因是从密码和盐派生加密密钥的种子,然后使用这些种子生成某些目的所需的实际密钥(例如 sodium_crypto_sign_detached())。
length
int; 要生成的密码哈希的长度,以字节为单位。
password
string; 要生成哈希的密码。
salt
在哈希之前添加到密码的盐。盐应该不可预测,理想情况下应该从良好的随机数源(例如 random_bytes())生成,并且长度正好为 SODIUM_CRYPTO_PWHASH_SALTBYTES
字节。
opslimit
表示要执行的最大计算量。增加此数字将使函数需要更多的 CPU 周期来计算密钥。有一些常量可用于根据预期用途将操作限制设置为适当的值,按强度排序:SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE
、SODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATE
和 SODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE
。
memlimit
函数将使用的最大 RAM 量,以字节为单位。有一些常量可以帮助您选择适当的值,按大小排序:SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
、SODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATE
和 SODIUM_CRYPTO_PWHASH_MEMLIMIT_SENSITIVE
。通常,这些应该与匹配的 opslimit
值配对。
algo
int 表示要使用的哈希算法的数字。默认情况下为 SODIUM_CRYPTO_PWHASH_ALG_DEFAULT
(当前推荐的算法,可能会在 libsodium 的不同版本之间更改),或者显式使用 SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13
,表示 Argon2id 算法版本 1.3。
返回派生的密钥。返回值是哈希的二进制字符串,而不是 ASCII 编码的表示形式,并且不包含有关用于创建哈希的参数的附加信息,因此如果您将来要验证密码,则需要保留该信息。使用 sodium_crypto_pwhash_str() 以避免需要执行所有这些操作。
示例 #1 sodium_crypto_pwhash() 示例
<?php
//如果我们将来能够检查此密码,则需要保留盐
$salt = random_bytes(SODIUM_CRYPTO_PWHASH_SALTBYTES);
//使用 bin2hex 保持输出可读
echo bin2hex(
sodium_crypto_pwhash(
16, // == 128 位
'password',
$salt,
SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE,
SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13
)
);
?>
以上示例将输出类似以下内容
a18f346ba57992eb7e4ae6abf3fd30ee