密码散列和验证

编辑该页面

密码散列和验证

大多数应用程序使用密码登录用户。这些密码散列来安全地存储它们。欧宝娱乐app下载地址Symfony的PasswordHasher组件提供所有公用事业安全散列和验证密码。

确保它是通过运行安装:

1
美元作曲家需要symfony / pa欧宝娱乐app下载地址ssword-hasher

5.3

PasswordHasher组件是在5.3中引入的。在这个版本之前,密码散列安全组件提供的功能。

配置一个密码切肉机

哈希密码之前,您必须配置一个厨师使用password_hashers选择。您必须配置散列算法选择一些算法的选择:

  • YAML
  • XML
  • PHP
  • 独立使用
1 2 3 4 5 6 7 8 9 10 11 12
#配置/包/ security.yaml安全:#……password_hashers:#汽车侍者用默认选项为用户类(和孩子)应用实体\ \用户:“汽车”#汽车厨师使用自定义选项对所有PasswordAuthenticatedUserInterface实例欧宝娱乐app下载地址Symfony \ \安全\ \用户\ PasswordAuthenticatedUserInterface核心组件:算法:“汽车”成本:15

5.3

password_hashers选项是在Symfony 5.3中引入的。欧宝娱乐app下载地址在以前的版本中它被称为编码器

在这个例子中,使用“自动”算法。这切肉机自动选择最安全的算法可以在您的系统。结合迁移密码,这允许您总是安全的密码以最安全的方式(即使新算法介绍了未来PHP版本)。

进一步在这篇文章中,你可以找到一个全部参考的所有支持的算法

提示

哈希密码是资源密集型和需要时间来生成安全的密码散列。一般来说,这使得你的密码哈希更安全。

然而,在测试安全散列不重要,所以你可以改变密码切肉机配置测试环境运行测试速度:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12
#配置/包/测试/ security.yamlpassword_hashers:#使用您的用户类的名字应用实体\ \用户:算法:明文#禁用散列(只做这个测试!)#或使用最低可能的值应用实体\ \用户:算法:汽车#这应该是相同的值作为配置/包/ security.yaml成本:4# bcrypt最低的值time_cost:3#为氩最低的价值memory_cost:10#为氩最低的价值

哈希密码

配置正确的算法后,您可以使用UserPasswordHasherInterface散列和验证密码:

  • 框架的使用
  • 独立使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36
/ / src /控制器/ RegistrationController.php名称空间应用程序\控制器;/ /……使用欧宝娱乐app下载地址\组件\HttpKernel\异常\AccessDeniedHttpException;使用欧宝娱乐app下载地址\组件\PasswordHasher\切肉机\UserPasswordHasherInterface;用户控件扩展AbstractController{公共函数登记(UserPasswordHasherInterface美元passwordHasher){/ /……如从一个注册表单获取用户数据美元用户=用户(…);美元plaintextPassword=……;/ /散列(基于安全的密码。yaml配置为$ user类)美元hashedPassword=美元passwordHasher- >hashPassword (美元用户,美元plaintextPassword);美元用户- >向setPassword (美元hashedPassword);/ /……}公共函数删除(UserPasswordHasherInterface美元passwordHasher,用户界面美元用户){/ /……如从一个“确认删除”对话框获得密码美元plaintextPassword=……;如果(!美元passwordHasher- >isPasswordValid (美元用户,美元plaintextPassword)){AccessDeniedHttpException ();}}}

重置密码

使用MakerBundle欧宝娱乐app下载地址SymfonyCastsResetPasswordBundle,您可以创建一个安全的开箱即用的解决方案来处理忘记密码。首先,安装SymfonyCastsRe欧宝娱乐app下载地址setPasswordBundle:

1
美元作曲家需要symfonycasts欧宝娱乐app下载地址 / reset-password-bundle

然后,使用:reset-password命令。这个问你几个问题关于你的应用程序并生成所有你需要的文件!之后,您将看到一条成功消息和一系列其他步骤你需要做的。

1
美元php bin /控制台:reset-password

您可以自定义包的行为通过更新重置密码reset_password.yaml文件。有关配置的更多信息,请查看欧宝娱乐app下载地址SymfonyCastsResetPasswordBundle指南。

迁移密码

为了保护密码,建议将它们存储使用最新的散列算法。这意味着,如果更好的散列算法是在您的系统上的支持,用户的密码重复。使用新的算法和存储。这是可能的migrate_from选择:

  1. 配置一个新厨师使用“migrate_from”
  2. 升级密码
  3. 可选地,触发密码迁移从一个定制的侍者

配置一个新厨师使用“migrate_from”

更好的散列算法可用时,你应该保持现有的侍者,重命名,然后定义新的。设置migrate_from选择新的厨师指向旧的,遗留侍者(s):

  • YAML
  • XML
  • PHP
  • 独立使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#配置/包/ security.yaml安全:#……password_hashers:#一个厨师在过去用于一些用户遗留问题:算法:sha256encode_as_base64:迭代:1应用实体\ \用户:#新厨师,连同它的选项算法:migrate_from:- - - - - -bcrypt#使用“bcrypt”侍者用默认选项- - - - - -遗产#使用上面的“遗留”切肉机配置

这个设置:

  • 新用户将散列算法;
  • 当一个用户登录的密码仍使用旧算法,存储Symfony将验证旧的密码算法,然后改变和更新使用新的密码算法。欧宝娱乐app下载地址

提示

汽车,本机,bcrypt切肉机自动启用密码迁移使用下面的列表migrate_from算法:

  1. PBKDF2(它使用hash_pbkdf2);
  2. 消息摘要(它使用哈希)

都使用的hash_algorithm设置的算法。推荐使用migrate_from而不是hash_algorithm,除非汽车切肉机使用。

升级密码

成功登录后,安全系统检查是否一个更好的算法可用于散列用户的密码。如果是,它会使用新的哈希散列正确的密码。当使用一个自定义的身份验证时,您必须使用的PasswordCredentials安全的护照

您可以启用升级行为通过实现这个新散列密码应该如何存储:

在这之后,你做的和密码总是尽可能安全散列!

请注意

当使用PasswordHasher组件外Symfony应用程序时,您必须手动使用欧宝娱乐app下载地址PasswordHasherInterface: needsRehash ()如果需要重新处理和检查方法PasswordHasherInterface: hash ()使用新的方法来改变明文密码算法。

升级密码当使用原则

当使用实体用户提供者、实现PasswordUpgraderInterfaceUserRepository(见原则文档的信息关于如何创建这个类如果不是已经创建)。这个接口实现存储新创建的密码散列:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ / src /仓库/ UserRepository.php名称空间应用程序\存储库;/ /……使用欧宝娱乐app下载地址\组件\安全\核心\用户\PasswordUpgraderInterface;UserRepository扩展EntityRepository实现了PasswordUpgraderInterface{/ /……公共函数upgradePassword(用户界面美元用户、字符串美元newHashedPassword):无效{/ /设置新的散列密码的用户对象美元用户- >向setPassword (美元newHashedPassword);/ /执行查询的数据库美元- >getEntityManager ()- >冲洗();}}

当使用自定义用户提供者升级密码

如果你使用定制用户提供者,实现PasswordUpgraderInterface在用户提供者:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src /安全/ UserProvider.php名称空间应用程序\安全;/ /……使用欧宝娱乐app下载地址\组件\安全\核心\用户\PasswordUpgraderInterface;UserProvider实现了UserProviderInterface,PasswordUpgraderInterface{/ /……公共函数upgradePassword(用户界面美元用户、字符串美元newHashedPassword):无效{/ /设置新的散列密码的用户对象美元用户- >向setPassword (美元newHashedPassword);/ /……保存新密码}}

触发密码迁移从一个定制的侍者

如果您正在使用一个自定义密码切肉机,您可以触发迁移通过返回的密码真正的needsRehash ()方法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src /安全/ CustomPasswordHasher.php名称空间应用程序\安全;/ /……使用欧宝娱乐app下载地址\组件\PasswordHasher\切肉机\UserPasswordHasherInterface;CustomPasswordHasher实现了UserPasswordHasherInterface{/ /……公共函数needsRehash(字符串美元散列):bool{/ /检查是否使用过时的切肉机当前的密码散列美元hashIsOutdated=……;返回美元hashIsOutdated;}}

叫密码切肉机

通常,使用相同的密码侍者为所有用户通过配置适用于一个特定类的所有实例。另一个选择是使用一个“命名为“厨师,然后选择你想要切肉机使用动态。

在默认情况下(如图所示的文章),汽车算法用于应用实体\ \用户

这可能是足够安全对于一个普通用户,但如果你想让你的管理员有一个更强的算法,例如汽车更高的成本。这可以用叫侍者:

  • YAML
  • XML
  • PHP
  • 独立使用
1 2 3 4 5 6 7
#配置/包/ security.yaml安全:#……password_hashers:严厉的:算法:汽车成本:15

这将创建一个侍者命名严厉的。为了一个用户实例来使用它,必须实现的类PasswordHasherAwareInterface。需要一个方法——的接口getPasswordHasherName ()——应该返回厨师使用的名称:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
/ / src /实体/ User.php名称空间应用程序\实体;使用欧宝娱乐app下载地址\组件\PasswordHasher\切肉机\PasswordHasherAwareInterface;使用欧宝娱乐app下载地址\组件\安全\核心\用户\PasswordAuthenticatedUserInterface;使用欧宝娱乐app下载地址\组件\安全\核心\用户\用户界面;用户实现了用户界面,PasswordAuthenticatedUserInterface,PasswordHasherAwareInterface{/ /……公共函数getPasswordHasherName():哦?字符串{如果(美元- >isAdmin ()) {返回“苛刻”;}返回;/ /使用默认的侍者}}

如果你创建你自己的密码切肉机实现PasswordHasherInterface,你必须注册一个服务为了使用它作为一个叫侍者:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
#配置/包/ security.yaml安全:#……password_hashers:app_hasher:id:“Hasher App \安全\ \ MyCustomPasswordHasher”

这将创建一个侍者命名app_hasher从服务ID应用Hasher \安全\ \ MyCustomPasswordHasher

支持算法

“汽车”侍者

它会自动选择最好的厨师。从5.3 Symfony开始欧宝娱乐app下载地址,它使用Bcrypt侍者。如果PHP或Symf欧宝娱乐app下载地址ony添加新密码厨师在未来,可能会选择一个不同的厨师。

正因为如此,哈希密码的长度可能会改变未来,所以确保分配足够的空间让他们坚持(varchar (255)应该是一个不错的设置)。

Bcrypt密码切肉机

它产生的哈希密码bcrypt密码哈希函数。哈希密码是60字符,所以确保分配足够的空间被持久化。此外,包括密码加密盐里面(每个新密码是自动生成的)所以你不必处理。

它唯一的配置选项成本,这是一个整数的范围4-31(在默认情况下,13)。每一个增加的成本双打的时候需要散列密码。这样设计的密码强度可以适应未来提高计算能力。

你可以在任何时候改变成本——即使你已经有一些密码散列使用不同的成本。新密码将散列使用新的成本,虽然已经将验证使用散列的成本使用散列时。

提示

一个简单的技术可以更加快捷地测试当使用BCrypt是设置的成本4允许的最小值,测试环境配置。

钠密码切肉机

它使用Argon2关键推导函数。Argon2支持被捆绑在PHP 7.2中引入的libsodium扩展。

哈希密码是96年字符,但由于哈希要求保存在散列结果在未来可能会改变,所以确保分配足够的空间被持久化。此外,包括密码加密盐里面(每个新密码是自动生成的)所以你不必处理。

的PBKDF2切肉机

使用PBKDF2厨师不再是建议对钠和BCrypt由于PHP添加支持。遗留应用程序仍然鼓励使用它升级到更新的哈希算法。

创建一个自定义密码侍者

如果你需要创建自己的,它需要遵循以下规则:

  1. 这个类必须实现PasswordHasherInterface(你也可以实现LegacyPasswordHasherInterface如果您的散列算法使用一个单独的盐);
  2. 的实现hash ()验证()必须验证密码长度不超过4096个字符。这是出于安全考虑(见cve - 2013 - 5750)。

    您可以使用isPasswordTooLong ()这张支票的方法。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33
/ / src /安全/厨师/ CustomVerySecureHasher.php名称空间应用程序\安全\切肉机;使用欧宝娱乐app下载地址\组件\PasswordHasher\异常\InvalidPasswordException;使用欧宝娱乐app下载地址\组件\PasswordHasher\切肉机\CheckPasswordLengthTrait;使用欧宝娱乐app下载地址\组件\PasswordHasher\PasswordHasherInterface;CustomVerySecureHasher实现了PasswordHasherInterface{使用CheckPasswordLengthTrait;公共函数哈希(字符串美元plainPassword):字符串{如果(美元- >isPasswordTooLong (美元plainPassword)){InvalidPasswordException ();}/ /……普通的密码散列在一个安全的方式返回美元hashedPassword;}公共函数验证(字符串美元hashedPassword、字符串美元plainPassword):bool{如果(= = =美元plainPassword| |美元- >isPasswordTooLong (美元plainPassword)){返回;}/ /……验证密码是否等于用户的密码以安全的方式返回美元passwordIsValid;}}

现在,定义一个密码切肉机使用id设置:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7
#配置/包/ security.yaml安全:#……password_hashers:app_hasher:#定制侍者的服务ID(使用默认services.yaml FQCN)id:“Hasher App \安全\ \ MyCustomPasswordHasher”
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
欧宝娱乐app下载地址Symfony 5.4支持通过私人Packagist