쩨이엠 개발 블로그

[MySQL] AES-256 암복호화 설정 (AES_DECRYPT) 본문

개발/ETC

[MySQL] AES-256 암복호화 설정 (AES_DECRYPT)

쩨이엠 2023. 9. 6. 19:24
728x90
반응형

 

서론

API에서 받아오는 데이터 값으로 암호화를 했더니 실제로 데이터를 찾기가 매우 어려워졌다

해서 DB에서 조회할 때엔 복호화 된 값으로 볼 수 있는 방법을 찾았더니 역시나 있었다 (멋진 사람들)

 

mysql의 기본 세팅은 하기와 같이 AES-128로 세팅이 되어있다

 

설정을 바꾸고 싶으면 set으로, 조회는 select로 가능하다

encryption 모드는 정해져 있는 것이 아니면 에러를 주기 때문에 이것저것 넣어도 맞는 모드만 들어간다

 SET @@block_encryption_mode='aes-256-ecb';

 

AES 암호화 중 제일 간단한 ecb 모드인 경우 Padding 설정도 없고 IV도 없어서 MySQL에서도 간단히 볼 수 있다 (내경우!)

 

 

Java 암호화코드

   public static String encryptAES(String key, String value) {
        try {
            Cipher cipher = Cipher.getInstance("AES");
            Key secretKey = new SecretKeySpec(Base64.decodeBase64(key), "AES");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            return Base64.encodeBase64String(cipher.doFinal(value.getBytes()));
        } catch (Exception e) {
            return null;
        }
    }

 

 

 

AES의 경우 IV값이 없는것은 ECB 모드가 유일하기때문에 권고하지는 않는 듯 하다

나중에 CBC로 변경해야지

AES 기본세팅은 256인듯

 

 

AES_DECRYPT 사용 방법

AES_DECRYPT(Encrypt data, Key)

SELECT AES_DECRYPT(FROM_BASE64('yVtylk5hYAky458OGFJhQQ=='), FROM_BASE64('WI05ewlWnf5/nPeqlFmPcsjicSgJhbngANMt0v87fRA='));

>> tistory

Encrypt data : yVtylk5hYAky458OGFJhQQ==

Key : WI05ewlWnf5/nPeqlFmPcsjicSgJhbngANMt0v87fRA=

 

Decrypt시 Base64로 decoding 해준 후 조회하면 값이 이쁘게 잘 나오는 것을 확인 할 수 있다

계속 null이 나오는데 뭐가 문제인지 몰라 이것 저것 다 해보느라 시간이 오래걸렸다 이리 간단한 것을...

 

원인은 FROM_BASE64가 없었기 때문이었는데 소스 코드 안에서 Base64로 인코딩/디코딩을 했던 게 있어서 함께 들어가야 데이터가 제대로 나왔다 (소스안에 답이 있다... 다흐흑)

 

암튼 완료!

 

+더 나아가서

매번 저렇게 쓰기엔 너무 귀찮다고 한다면

+ 키값이 바뀌지 않는다면

Mysql 함수를 사용할 수 있다

 

create function `DECRYPT`(
 PARAMETER varchar(200) -- parameter로 받아올 값 넉넉하게 잡았다 PARAMETER는 변경 가능!
) RETURNS varchar(200) -- return 값
BEGIN
    RETURN AES_DECRYPT(FROM_BASE64(PARAMETER), FROM_BASE64('WI05ewlWnf5/nPeqlFmPcsjicSgJhbngANMt0v87fRA='));
end;

간단하게 return에 써주면 밑처럼 간단하게 조회가 가능하다

SELECT DECRYPT(email) from test_table;

 

끝!

728x90
반응형
Comments