Symfony如何为argon2存储salt字符串? argon中的salt在编码密码时是必须的,但在用户实体中没有存储salt字符串。口令编码器中的函数支持盐作为参数,但它是空的,从未使用过。
vendorsymfonysecurity-coreEncoderSodiumPasswordEncoder.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
随机盐将被生成,如在 文献:
使用CPU和内存硬的哈希算法。伴随着随机生成的盐分以及内存和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
The 响应的不同部分 分别为 $
字,并如下。
argon2i
:使用的算法v=19
:版本m=32768,t=4,p=1
:算法选项(内存成本、时间成本和要使用的线程) smna9HfWD+caJJakZiekyQ
这是自动生成的盐。qbflsyuP3txLRgsGIt1alcv7HmYjfiMPanYtDU0LtCA
. 实际的哈希值这是存储在 UserInterface::$password
,如你所见,它包含了验证哈希所需的所有信息,包括盐。将盐分存储在一个单独的字段中已经过时了,这个字段的保留只是为了向后兼容。
任何使用上述方法或推荐的 password_hash
如果没有专门的盐场,就能满足他们的所有需求。