我正在研究一个使用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;