繁体   English   中英

Symfony 5 如何存储 argon2 的盐?

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

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

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

这是存储在UserInterface::$password上的内容,如您所见,其中包含验证 hash 所需的所有信息,包括盐。 不推荐将盐存储在单独的字段中,并且仅保留该字段以实现向后兼容性。

任何使用上述方法或推荐的password_hash的人都可以在没有专门的 salt 字段的情况下满足他们的所有需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM