symfony如何为arg2存储盐串?编码密码时,氩气中的盐是必填项,但用户实体中未存储盐串。密码编码器中的功能支持salt作为参数,但为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
参数未使用,因为在每次调用sodium_crypto_pwhash_str
随机盐时都会生成,如docs中所述:
使用CPU和内存硬哈希算法以及随机生成的salt和内存和CPU限制来生成适用于密码存储的ASCII编码哈希。
返回值将包含散列的密码,使用的算法,盐,内存成本,时间成本等。重新散列和验证用户提供的密码所需的所有内容都存储在上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
。实际的哈希值。这是存储在上的内容UserInterface::$password
,如您所见,其中包含验证哈希值所需的所有信息,包括盐。不建议将盐存储在单独的字段中,并且仅保留该字段是为了向后兼容。
使用上述方法或推荐方法的任何人password_hash
都可以满足他们的所有需求,而无需专门的盐田。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句