Cara Searching Data Yang Di Encrypt (AES) Di PostgreSQL dan Spring Boot

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() + "%");
    }
1 Like