Disini saya mau sedikit sharing mengenai issue saya di project yaitu adanya data yang sudah di enkripsi menggunakan aes baru disimpan ke database, ketika dilakukan searching menggunakan jpa specification pada field tersebut itu tidak bisa karena value nya beda dengan asli nya. setelah saya coba ulik di google nemu function dari postgresql yaitu pgcrypto disini .
nah dari function itu saya coba bikin function baru untuk menghandle decrypt aes ketika melakukan searching dengan specification.
Untuk function nya seperti berikut
CREATE OR REPLACE FUNCTION decrypt_and_convert(data text, key text)
RETURNS TEXT AS
$$
DECLARE
decrypted TEXT;
BEGIN
BEGIN
decrypted := convert_from(
decrypt(
decode(data, 'base64'),
key::bytea,
'aes-ecb'::text
),
'UTF8'
);
EXCEPTION
WHEN others THEN
decrypted := data; -- Mengembalikan data asli jika terjadi kesalahan
END;
RETURN decrypted;
END;
$$
LANGUAGE plpgsql;
selanjutnya saya bikin searching di specification untuk manggil function yang ada di database yaitu:
private Predicate searchPartnerName(Root<Partner> root, CriteriaBuilder criteriaBuilder) {
Expression<String> decrypted = criteriaBuilder.function(
"decrypt_and_convert", String.class,
root.get("partnerName"),
criteriaBuilder.literal(dto.getSecretKey())
);
return criteriaBuilder.like(
criteriaBuilder.lower(decrypted),
"%" + dto.getPartnerName().trim().toLowerCase() + "%");
}
