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 主动身份验证 指南。

lock 在构建时修复的配置属性 - 所有其他配置属性在运行时可覆盖

配置属性

类型

default

lock quarkus.security-jpa.persistence-unit-name

选择 Hibernate ORM 持久性单元。如果没有指定值,则使用默认持久性单元。

环境变量: QUARKUS_SECURITY_fabric_PERSISTENCE_UNIT_NAME

string

<default>

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.