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 主动身份验证 指南。
build 时修复的 - 配置属性在构建时修复 - 所有其他配置属性在运行时可覆盖
| 配置属性 | 类型 | default |
|
在构建时为 quarkus.security-jpa.persistence-unit-name] 选择 Hibernate ORM 持久性单元。如果没有指定值,则使用默认持久性单元。
环境变量: | string |
|