是否可以在 pgcrypto 的休眠@ColumnTransformer中可变密码?



我正在研究一个使用pgcrypto加密基础的某些列的postgresql基础。

在Java方面,我使用JPA将我的类"映射"到我的数据库。

目前,要在java中加密和解密字段,我使用@ColumnTransformer。例:

@Column(name = "my_column", nullable = false)
@ColumnTransformer(read = "pgp_sym_decrypt(my_column, "my_password")", write = "pgp_sym_encrypt(?, "my_password")")
private String myColumn;

这工作正常。但我想改变我的密码。我的应用程序将部署在多台服务器上,每台服务器的密码都不同。

我尝试了很多东西,我在互联网上搜索,但我什么也没找到。 所以我开始思考...这可以通过此注释实现吗?还是我应该以另一种方式加密/解密?也许在存储库中?

PS以下是我尝试过的几个例子:

@ColumnTransformer(read = "pgp_sym_decrypt(my_column, ${application.security.pgcryptoPassword})", write = "pgp_sym_encrypt(?, ${application.security.pgcryptoPassword})")

在我的配置文件中定义了application.security.pgcryptoPassword

@Value("${application.security.pgcryptoPassword}")
private static final String pgcryptoPassword;
private static final String readCreator = "pgp_sym_decrypt(creation_aladdin_par, " + pgcryptoPassword + ")";
@ColumnTransformer(read = readCreator, write = "pgp_sym_encrypt(?, my_password)")

编辑

我尝试了两件事:

private static final String pgcryptoPassword = "my_password";
@ColumnTransformer(read = "pgp_sym_decrypt(my_column, '" + pgcryptoPassword + "')", write = "pgp_sym_encrypt(?, '" + pgcryptoPassword  + "')")
private String myColumn;

@Value("${application.security.pgcryptoPassword}")
private static final String pgcryptoPassword;
@ColumnTransformer(read = "pgp_sym_decrypt(my_column, '" + pgcryptoPassword + "')", write = "pgp_sym_encrypt(?, '" + pgcryptoPassword  + "')")
private String myColumn;

第一个有效,其次我收到错误:
The value for annotation attribute ColumnTransformer.read must be a constant expression
从我在互联网上发现的此错误来看,我认为无法在配置文件中可变我的密码并在@ColumnTransformer注释中使用它。

你同意我的观点还是有其他解决方案?

不能在批注中使用静态参数以外的参数。

我们所做的是在当前的jdbc会话中设置密码(事务拦截器(

SET env_key = 'my-super-secret-pwd';

然后通过PostgreSQL函数读取密码

current_setting('enc_key')

在 Quarkus 中,事务拦截器如下所示:

@Dependent
@Unremovable
public class TransactionObserver {
@ConfigProperty(name = "my.encryption.key")
String envEncryptionKey;
@Inject
EntityManager em;
public void interceptTransaction(@Observes @Initialized(TransactionScoped.class) Transaction tx) {
addEncryptionKeyToSession();
}
private void addEncryptionKeyToSession() {
em.createNativeQuery("SET enc_key = '" + envEncryptionKey + "';").executeUpdate();
}
}

在实体中,您可以执行以下操作:

@ColumnTransformer(read = "pgp_sym_decrypt(NAME, current_setting('enc_key'))", write = "pgp_sym_encrypt(?, current_setting('enc_key'))")
@Column(name = "NAME", columnDefinition = "bytea", unique = false, nullable = true)
public String name;

相关内容

  • 没有找到相关文章

最新更新