[START CHUNK 1/3]
### test2.txt ###

Password Hashing and Verification
Edit this page
Most applications use passwords to login users. These passwords should be hashed to securely store them. Symfony's PasswordHasher component provides all utilities to safely hash and verify passwords.

Make sure it is installed by running:

composer require symfony/password-hasher
Configuring a Password Hasher
Before hashing passwords, you must configure a hasher using the password\_hashers option. You must configure the hashing algorithm and optionally some algorithm options:

 Copy
# config/packages/security.yaml
security:
 # ...

 password\_hashers:
 # auto hasher with default options for the User class (and children)
 App\Entity\User: 'auto'

 # auto hasher with custom options for all PasswordAuthenticatedUserInterface instances
 Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface:
 algorithm: 'auto'
 cost: 15
In this example, the "auto" algorithm is used. This hasher automatically selects the most secure algorithm available on your system. Combined with password migration, this allows you to always secure passwords in the safest way possible (even when new algorithms are introduced in future PHP releases).

Further in this article, you can find a full reference of all supported algorithms.

Hashing passwords is resource intensive and takes time in order to generate secure password hashes. In general, this makes your password hashing more secure.

In tests however, secure hashes are not important, so you can change the password hasher configuration in test environment to run tests faster:

 Copy
# config/packages/test/security.yaml
security:
 # ...

 password\_hashers:
 # Use your user class name here
 App\Entity\User:
 algorithm: plaintext # disable hashing (only do this in tests!)

 # or use the lowest possible values
 App\Entity\User:
 algorithm: auto # This should be the same value as in config/packages/security.yaml
 cost: 4 # Lowest possible value for bcrypt
 time\_cost: 3 # Lowest possible value for argon
 memory\_cost: 10 # Lowest possible value for argon
Hashing the Password
After configuring the correct algorithm, you can use the UserPasswordHasherInterface to hash and verify the passwords:

 Copy
// src/Controller/RegistrationController.php
namespace App\Controller;

// ...
use
Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;

class UserController extends AbstractController
{
 public function registration(UserPasswordHasherInterface $passwordHasher)
 {
 // ... e.g. get the user data from a registration form
 $user = new User(...);
 $plaintextPassword = ...;

 // hash the password (based on the security.yaml config for the $user class)
 $hashedPassword = $passwordHasher->hashPassword(
 $user,
 $plaintextPassword
 );
 $user->setPassword($hashedPassword);

 // ...
 }

 public function delete(UserPasswordHasherInterface $passwordHasher, UserInterface $user)
 {
 // ... e.g. get the password from a "confirm deletion" dialog
 $plaintextPassword = ...;

 if (!$passwordHasher->isPasswordValid($user, $plaintextPassword)) {
 throw new AccessDeniedHttpException();
 }
 }
}
Reset Password
Using MakerBundle and SymfonyCastsResetPasswordBundle, you can create a secure out of the box solution to handle forgotten passwords. First, install the SymfonyCastsResetPasswordBundle:

composer require symfonycasts/reset-password-bundle
Then, use the make:reset-password command. This asks you a few questions about your app and generates all the files you need! After, you'll see a success message and a list of any other steps you need to do.

php bin/console make:reset-password
You can customize the reset password bundle's behavior by updating the reset\_password.yaml file. For more information on the configuration, check out the SymfonyCastsResetPasswordBundle guide.

Password Migration
In order to protect passwords, it is recommended to store them using the latest hash algorithms. This means that if a better hash algorithm is supported on your system, the user's password should be rehashed using the newer algorithm and stored. That's possible with the migrate\_from option:

Configure a new Hasher Using "migrate\_from"
Upgrade the Password
Optionally, Trigger Password Migration From a Custom Hasher
Configure a new Hasher Using "migrate\_from"
When a better hashing algorithm becomes available, you should keep the existing hasher(s), rename it, and then define the new one. Set the migrate\_from option on the new hasher to point to the old, legacy hasher(s):

 Copy
# config/packages/security.yaml
security:
 # ...

 password\_hashers:
 # a hasher used in the past for some users
 legacy:
 algorithm: sha256
 encode\_as\_base64: false
 iterations: 1

 App\Entity\User:
 # the new hasher, along with its options
 algorithm: sodium
 migrate\_from:
 - bcrypt # uses the "bcrypt" hasher with the default options
 - legacy # uses the "legacy" hasher configured above
With this setup:

New users will be hashed with the new algorithm;
Whenever a user logs in whose password is still stored using the old algorithm, Symfony will verify the password with the old algorithm and then rehash and update the password using the new algorithm.
The auto, native, bcrypt and argon hashers automatically enable password migration using the following list of migrate\_from algorithms:

PBKDF2 (which uses hash\_pbkdf2);
Message digest (which uses hash)
Both use the hash\_algorithm setting as the algorithm. It is recommended to use migrate\_from instead of hash\_algorithm, unless the auto hasher is used.

Upgrade the Password
Upon successful login, the Security system checks whether a better algorithm is available to hash the user's password. If it is, it'll hash the correct password using the new hash. When using a custom authenticator, you must use the PasswordCredentials in the security passport.

You can enable the upgrade behavior by implementing how this newly hashed password should be stored:

When using Doctrine's entity user provider
When using a custom user provider
After this, you're done and passwords are always hashed as securely as possible!

When using the PasswordHasher component outside a Symfony application, you must manually use the PasswordHasherInterface::needsRehash() method to check if a rehash is needed and PasswordHasherInterface::hash() method to rehash the plaintext password using the new algorithm.

Upgrade the Password when using Doctrine
When using the entity user provider, implement PasswordUpgraderInterface in the UserRepository (see the Doctrine docs for information on how to create this class if it's not already created). This interface implements storing the newly created password hash:

 Copy
// src/Repository/UserRepository.php
namespace App\Repository;

// ...
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\PasswordUpgraderInterface;

class UserRepository extends EntityRepository implements PasswordUpgraderInterface
{
 // ...

 public function upgradePassword(PasswordAuthenticatedUserInterface $user, string $newHashedPassword): void
 {
 // set the new hashed password on the User object
 $user->setPassword($newHashedPassword);

 // execute the queries on the database
 $this->getEntityManager()->flush();
 }
}
Upgrade the Password when using a Custom User Provider
If you're using a custom user provider, implement the PasswordUpgraderInterface in the user provider:

 Copy
// src/Security/UserProvider.php
namespace App\Security;

// ...
use Symfony\Component\Security\Core\User\PasswordUpgraderInterface;

class UserProvider implements UserProviderInterface, PasswordUpgraderInterface
{
 // ...

 public function upgradePassword(UserInterface $user, string $newHashedPassword): void
 {
 // set the new hashed password on the User object
 $user->setPassword($newHashedPassword);

 // ... store the new password
 }
}
Trigger Password Migration From a Custom Hasher
If you're using a custom password hasher, you can trigger the password migration by returning true in the needsRehash() method:

 Copy
// src/Security/CustomPasswordHasher.php
namespace App\Security;

// ...
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;

class CustomPasswordHasher implements
[END CHUNK 1/3]
Reply with OK: [CHUNK x/TOTAL], don't reply anything else, don't explain the text!
[시작 청크 1/3]### test2.txt ###비밀번호 해싱 및 확인이 페이지 편집하기대부분의 애플리케이션은 사용자 로그인에 비밀번호를 사용합니다. 이러한 비밀번호는 안전하게 저장하기 위해 해싱되어야 합니다. 심포니의 PasswordHasher 컴포넌트는 비밀번호를 안전하게 해시하고 확인할 수 있는 모든 유틸리티를 제공합니다.컴포넌트가 설치되어 있는지 확인하세요:작곡가 심포니/패스워드해셔 필요비밀번호 해셔 구성하기비밀번호를 해싱하기 전에 password\_hashers 옵션을 사용하여 해셔를 구성해야 합니다. 해싱 알고리즘과 선택적으로 몇 가지 알고리즘 옵션을 구성해야 합니다: 복사# config/packages/security.yaml보안: # ... 암호\_해셔: # User 클래스(및 자식)에 대한 기본 옵션이 있는 자동 해셔 App\Entity\User: 'auto' # 모든 PasswordAuthenticatedUserInterface 인스턴스에 대한 사용자 지정 옵션이 있는 자동 해셔 Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 알고리즘: 'auto' cost: 15이 예에서는 "auto" 알고리즘이 사용됩니다. 이 해서는 시스템에서 사용 가능한 가장 안전한 알고리즘을 자동으로 선택합니다. 비밀번호 마이그레이션과 함께 사용하면 향후 PHP 릴리스에서 새로운 알고리즘이 도입되는 경우에도 항상 가장 안전한 방법으로 비밀번호를 보호할 수 있습니다.이 글의 뒷부분에서 지원되는 모든 알고리즘에 대한 전체 참조를 확인할 수 있습니다.비밀번호 해시는 리소스 집약적이며 안전한 비밀번호 해시를 생성하는 데 시간이 걸립니다. 일반적으로 해싱을 사용하면 비밀번호 해싱이 더 안전해집니다.그러나 테스트에서는 보안 해시가 중요하지 않으므로 테스트 환경에서 비밀번호 해셔 구성을 변경하여 테스트를 더 빠르게 실행할 수 있습니다: 복사# config/packages/test/security.yamlsecurity: # ... password\_hashers: # 여기에 사용자 클래스 이름 사용 App\Entity\User: 알고리즘: 일반 텍스트 # 해싱 비활성화(테스트에서만 수행!) # 또는 가능한 가장 낮은 값 사용 App\Entity\User: algorithm: auto # 이 값은 config/packages/security.yaml과 동일해야 합니다. cost: 4 # bcrypt에 가능한 가장 낮은 값 time\_cost: 3 # 아르곤의 가능한 최저값 memory\_cost: 10 # 아르곤의 가능한 최저값비밀번호 해싱하기올바른 알고리즘을 구성한 후 UserPasswordHasherInterface를 사용하여 비밀번호를 해시하고 확인할 수 있습니다: 복사// src/Controller/RegistrationController.php네임스페이스 App\Controller;// ...사용심포니\컴포넌트\Http커널\예외\AccessDeniedHttpException;사용 Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;UserController 클래스 추상 컨트롤러 확장{ public function registration(UserPasswordHasherInterface $passwordHasher) { // ... 예를 들어 등록 양식에서 사용자 데이터를 가져옵니다. user = new User(...); 일반 텍스트 암호 = ...; // 비밀번호를 해시합니다($user 클래스에 대한 security.yaml 구성에 따라). 해시된 비밀번호 = $passwordHasher->hashPassword( $user, 일반 텍스트 비밀번호 ); 사용자->설정 패스워드($해시된 패스워드); // ... } 공개 함수 삭제(UserPasswordHasherInterface $passwordHasher, UserInterface $user) { // ... 예를 들어 "삭제 확인" 대화 상자에서 비밀번호를 가져옵니다. 일반 텍스트 암호 = ...; if (!$passwordHasher->isPasswordValid($user, $plaintextPassword)) { 새로운 AccessDeniedHttpException()을 던집니다; } }}비밀번호 재설정메이커번들(MakerBundle)과 심포니캐스트 비밀번호 재설정 번들(SymfonyCastsResetPasswordBundle)을 사용하면 잊어버린 비밀번호를 처리하는 안전한 즉시 사용 가능한 솔루션을 만들 수 있습니다. 먼저 심포니캐스트 리셋 패스워드 번들을 설치합니다:컴포저에 심포니캐스트/리셋패스워드번들이 필요합니다.그런 다음 make:reset-password 명령을 사용합니다. 앱에 대한 몇 가지 질문을 하고 필요한 모든 파일을 생성합니다! 그 후 성공 메시지와 수행해야 할 다른 단계의 목록이 표시됩니다.php bin/console make:reset-passwordreset\_password.yaml 파일을 업데이트하여 비밀번호 재설정 번들의 동작을 사용자 지정할 수 있습니다. 구성에 대한 자세한 내용은 SymfonyCastsResetPasswordBundle 가이드를 참조하세요.비밀번호 마이그레이션비밀번호를 보호하려면 최신 해시 알고리즘을 사용하여 비밀번호를 저장하는 것이 좋습니다. 즉, 시스템에서 더 나은 해시 알고리즘이 지원되는 경우 최신 알고리즘을 사용하여 사용자의 비밀번호를 다시 해시하여 저장해야 합니다. 마이그레이트\_from 옵션을 사용하면 가능합니다:"마이그레이트\_from"을 사용하여 새 해셔 구성하기비밀번호 업그레이드선택 사항으로 사용자 정의 해셔에서 비밀번호 마이그레이션 트리거하기"migrate\_from"을 사용하여 새 해셔 구성하기더 나은 해싱 알고리즘을 사용할 수 있게 되면 기존 해셔를 유지하고 이름을 변경한 다음 새 해셔를 정의해야 합니다. 새 해셔에서 이전 레거시 해셔를 가리키도록 마이그레이트\_from 옵션을 설정합니다: Copy# config/packages/security.yamlsecurity: # ... 암호\_해셔: # 과거에 일부 사용자가 사용한 해셔 legacy: 알고리즘: sha256 encode\_as\_base64: false 반복 횟수 1 App\Entity\User: # 새 해셔와 해당 옵션 알고리즘: 나트륨 마이그레이트\_from: - bcrypt # 기본 옵션과 함께 "bcrypt" 해셔를 사용합니다. - legacy # "legacy" h를 사용합니다.