是否可以在Hibernate @ColumnTransformer中为pgcrypto可变化密码?

jvlzgdj9  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(117)

我正在开发一个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注解中使用它。
你同意我的看法还是有别的解决办法?

cgfeq70w

cgfeq70w1#

您不能在注解中使用静态参数以外的参数。
我们所做的是在当前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;

相关问题