2.3. 密码存储和散列
使用 Quarkus 开发应用程序时,您可以决定如何管理密码存储和散列。您可以保留 Quarkus 的默认密码和散列设置,也可以手动哈希密码。
使用默认选项时,密码通过 Modular Crypt 格式 (MCF)下的 bcrypt 存储和散列。在使用 MCF 时,哈希算法、迭代计数和 salt 存储为散列值的一部分。因此,我们不需要专用的列来保留它们。
在加密中,salt 是一个随机数据的名称,用作对数据、密码或密码短语哈希的单向函数的额外输入。
要表示存储在不同算法的数据库中的密码,请创建一个实施 org.wildfly.security.password.PasswordProvider
的类,如下例所示。
以下代码片段演示了如何设置自定义密码提供程序,它代表使用 SHA256 哈希算法哈希的密码。
import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.Table; import io.quarkus.security.jpa.Password; import io.quarkus.security.jpa.PasswordType; import io.quarkus.security.jpa.Roles; import io.quarkus.security.jpa.UserDefinition; import io.quarkus.security.jpa.Username; @UserDefinition @Table(name = "test_user") @Entity public class CustomPasswordUserEntity { @Id @GeneratedValue public Long id; @Column(name = "username") @Username public String name; @Column(name = "password") @Password(value = PasswordType.CUSTOM, provider = CustomPasswordProvider.class) public String pass; @Roles public String role; }
import jakarta.xml.bind.DatatypeConverter; import org.wildfly.security.password.Password; import org.wildfly.security.password.interfaces.SimpleDigestPassword; import io.quarkus.security.jpa.PasswordProvider; public class CustomPasswordProvider implements PasswordProvider { @Override public Password getPassword(String passwordInDatabase) { byte[] digest = DatatypeConverter.parseHexBinary(passwordInDatabase); // Let the security runtime know that this passwordInDatabase is hashed by using the SHA256 hashing algorithm return SimpleDigestPassword.createRaw(SimpleDigestPassword.ALGORITHM_SIMPLE_DIGEST_SHA_256, digest); } }
要快速创建散列化密码,请使用 String BcryptUtil.bcryptHash (String password)
,它默认为在 10 个迭代中创建随机 salt 和 hash。此方法还允许指定使用的 iterations 和 salt 的数量。
对于在生产环境中运行的应用程序,请不要将密码存储为纯文本。
但是,在测试环境中运行时,可以将密码以纯文本形式存储为 @Password (PasswordType.CLEAR)
注释。
支持 Hibernate 多租户,您可以将用户实体存储在启用了多租户的持久性单元中。但是,如果您的 io.quarkus.hibernate.orm.runtime.tenant.TenantResolver
必须访问 io.vertx.ext.web.RoutingContext
来解析请求详情,您必须禁用主动身份验证。有关主动身份验证的更多信息,请参阅 Quarkus 主动身份验证 指南。
在构建时修复的配置属性 - 所有其他配置属性在运行时可覆盖
配置属性 | 类型 | default |
选择 Hibernate ORM 持久性单元。如果没有指定值,则使用默认持久性单元。
环境变量: | string |
|