[英]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.