簡體   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