Symfony 5如何存储arg2的盐?

尼古拉姆

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

响应不同部分$字符分隔,如下所示:

  1. argon2i:使用的算法
  2. v=19:版本
  3. m=32768,t=4,p=1:算法选项(内存成本,时间成本和要使用的线程)
  4. smna9HfWD+caJJakZiekyQ 这是自动生成的盐。
  5. qbflsyuP3txLRgsGIt1alcv7HmYjfiMPanYtDU0LtCA实际的哈希值。

这是存储在上的内容UserInterface::$password,如您所见,其中包含验证哈希值所需的所有信息,包括盐。不建议将盐存储在单独的字段中,并且仅保留该字段是为了向后兼容。

使用上述方法或推荐方法的任何人password_hash都可以满足他们的所有需求,而无需专门的盐田。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章