2.3. パスワードストレージおよびハッシュ
Quarkus を使用してアプリケーションを開発する場合は、パスワードの保存とハッシュの管理方法を決定できます。Quarkus のデフォルトのパスワードとハッシュ設定をそのまま使用することも、手動でパスワードをハッシュすることもできます。
デフォルトオプションでは、パスワードは Modular Crypt Format (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.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); } }
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)
を使用します。デフォルトでは、ランダムな salt が作成され、反復 10 回分、ハッシュ化されます。このメソッドでは、使用される反復回数と salt の数を指定することもできます。
実稼働環境で実行されるアプリケーションの場合は、パスワードをプレーンテキストとして保存しないでください。
ただし、テスト環境で操作する場合は、@Password (PasswordType.CLEAR)
アノテーションを使用してパスワードをプレーンテキストとして保存できます。
Hibernate マルチテナンシー がサポートされており、マルチテナンシーが有効な永続ユニットにユーザーエンティティーを保存できます。ただし、io.quarkus.hibernate.orm.runtime.tenant.TenantResolver
が io.vertx.ext.web.RoutingContext
にアクセスしてリクエストの詳細を解決する必要がある場合は、プロアクティブ認証を無効にする必要があります。プロアクティブ認証の詳細は、Quarkus の プロアクティブ認証 ガイドを参照してください。
ビルド時に固定された設定プロパティー: その他の設定プロパティーはすべて実行時にオーバーライドできます。
設定プロパティー | 型 | デフォルト |
Hibernate ORM 永続ユニットを選択します。値の指定がない場合はデフォルトの永続ユニットが使用されます。
環境変数: | string |
|