PHP 大会日本 2024

sodium_crypto_pwhash

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_pwhash使用 Argon2 从密码派生密钥

描述

sodium_crypto_pwhash(
    int $length,
    #[\SensitiveParameter] string $password,
    string $salt,
    int $opslimit,
    int $memlimit,
    int $algo = SODIUM_CRYPTO_PWHASH_ALG_DEFAULT
): string

此函数提供对 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_INTERACTIVESODIUM_CRYPTO_PWHASH_OPSLIMIT_MODERATESODIUM_CRYPTO_PWHASH_OPSLIMIT_SENSITIVE

memlimit

函数将使用的最大 RAM 量,以字节为单位。有一些常量可以帮助您选择适当的值,按大小排序:SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVESODIUM_CRYPTO_PWHASH_MEMLIMIT_MODERATESODIUM_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

添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top