我正在开发一个postgresql库,它使用pgcrypto来加密库中的一些列。
Java方面,我使用JPA将我的类“Map”到我的数据库。
目前,在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
注解中使用它。
你同意我的看法还是有别的解决办法?
1条答案
按热度按时间cgfeq70w1#
您不能在注解中使用静态参数以外的参数。
我们所做的是在当前JDBC会话中设置密码(事务拦截器)
然后通过postgresql函数读取密码
在Quarkus中,事务拦截器如下所示:
在实体中你会这样做: