Symfony 5如何为argon2存储盐字符串?

问题描述 投票:0回答:1

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.');
}
symfony security hash
1个回答
2
投票

盐是直接存储在哈希密码中的,不需要使用单独的字段来存储盐。

在密码编码器中的函数支持盐作为参数,但在密码编码器中的盐是直接存储在哈希密码上的,不需要使用单独的字段来存储盐。$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 响应的不同部分 分别为 $ 字,并如下。

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

这是存储在 UserInterface::$password,如你所见,它包含了验证哈希所需的所有信息,包括盐。将盐分存储在一个单独的字段中已经过时了,这个字段的保留只是为了向后兼容。

任何使用上述方法或推荐的 password_hash 如果没有专门的盐场,就能满足他们的所有需求。

© www.soinside.com 2019 - 2024. All rights reserved.