[英]How Symfony 5 stores salt for argon2?
symfony如何存儲argon2的鹽串? 在對密碼進行編碼時,氬中的鹽是強制性的,但用戶實體中沒有存儲鹽字符串。 密碼編碼器中的 Function 支持鹽作為參數,但它是 null 並且從未使用過
/vendor/symfony/security-core/Encoder/SodiumPasswordEncoder.php
public function encodePassword(string $raw, ?string $salt): string
{
if (\strlen($raw) > self::MAX_PASSWORD_LENGTH) {
throw new BadCredentialsException('Invalid password.');
}
if (\function_exists('sodium_crypto_pwhash_str')) {
return sodium_crypto_pwhash_str($raw, $this->opsLimit, $this->memLimit);
}
if (\extension_loaded('libsodium')) {
return \Sodium\crypto_pwhash_str($raw, $this->opsLimit, $this->memLimit);
}
throw new LogicException('Libsodium is not available. You should either install the sodium extension, upgrade to PHP 7.2+ or use a different encoder.');
}
Salt直接存儲在哈希密碼上,無需使用單獨的字段來存儲鹽。
不使用$salt
參數,因為在每次調用sodium_crypto_pwhash_str
時都會生成一個隨機鹽,如文檔中所述:
使用 CPU 和內存硬 hash 算法以及隨機生成的 salt ,以及 memory 和 CPU 限制來生成適合密碼存儲的 ASCII 編碼 hash。
返回值將包含散列密碼、使用的算法、鹽、memory 成本、時間成本等。重新散列和驗證用戶提供的密碼所需的一切,這就是存儲在UserInterface::$password
上的內容。
例如,調用:
sodium_crypto_pwhash_str('secret_string',
SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);
會返回這樣的東西:
$argon2i$v=19$m=32768,t=4,p=1$smna9HfWD+caJJakZiekyQ$qbflsyuP3txLRgsGIt1alcv7HmYjfiMPanYtDU0LtCA
響應的不同部分由$
字符分隔,如下所示:
argon2i
: 使用的算法v=19
: 版本m=32768,t=4,p=1
:算法選項(內存成本、時間成本和要使用的線程)smna9HfWD+caJJakZiekyQ
這是自動生成的鹽。qbflsyuP3txLRgsGIt1alcv7HmYjfiMPanYtDU0LtCA
。 實際 hash。 這是存儲在UserInterface::$password
上的內容,如您所見,其中包含驗證 hash 所需的所有信息,包括鹽。 不推薦將鹽存儲在單獨的字段中,並且僅保留該字段以實現向后兼容性。
任何使用上述方法或推薦的password_hash
的人都可以在沒有專門的 salt 字段的情況下滿足他們的所有需求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.