PHP 日本研討會 2024

sodium_crypto_pwhash_str

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_pwhash_str取得 ASCII 編碼的雜湊值

描述

sodium_crypto_pwhash_str(#[\SensitiveParameter] string $password, int $opslimit, int $memlimit): string

使用 CPU 和記憶體密集型雜湊演算法,並結合隨機產生的鹽值,以及記憶體和 CPU 限制,以產生適用於密碼儲存的 ASCII 編碼雜湊值。

參數

password

string;要產生雜湊值的密碼。

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 值配對使用。

回傳值

返回雜湊後的密碼。

為了從相同的密碼產生相同的密碼雜湊,必須使用相同的 opslimitmemlimit 值。這些值會嵌入在產生的雜湊值中,因此會包含驗證雜湊值所需的一切。這允許 sodium_crypto_pwhash_str_verify() 函數驗證雜湊值,而無需為其他參數單獨儲存。

範例

範例 1 sodium_crypto_pwhash_str() 範例

<?php
$password
= 'password';
echo
sodium_crypto_pwhash_str(
$password,
SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);

上面的範例會輸出類似下面的結果

$argon2id$v=19$m=65536,t=2,p=1$oWIfdaXwWwhVmovOBc2NAQ$EbsZ+JnZyyavkafS0hoc4HdaOB0ILWZESAZ7kVGa+Iw

注意事項

注意:

雜湊值是使用 Argon2ID 演算法計算的,可抵抗 GPU 和側通道攻擊。與 password_hash() 函數相比,沒有鹽值參數(鹽值會自動產生),且 opslimitmemlimit 參數不是可選的。

參見

新增註解

使用者貢獻的註解 1 個註解

4
marcus at synchromedia dot co dot uk
3 年前
如果您想確保使用 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
To Top