본문 바로가기

Java

MySQL과 Java AES 128 암호/복호 동기화하기 (대칭키, 양방향)

Java에서 AES 128 로 암호화한걸 MySQL 쿼리로 조회해야한다던지
DB 기존 데이터를 암호화 마이그레이션을 진행하기 위해 MySQL과 Java의 암/복호화가 필요합니다.

삽질끝에 ...
MySQL은 AES 128bit만 적용이 가능합니다.
그리고 암호화모드는 ECB만 가능하며 CBC는 적용할 수 없습니다.
(추가로 알아보니.!!! MySQL 5.5까지만 디폴드.. 5.6부터는 암호화 방식이 변경 가능합니다!)
- MySQL 5.6부터는 block_encryption_mode 변수 값을 통해 암호화 방식을 변경할 수 있습니다.
https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_block_encryption_mode
Java에서 AES/CBC/PKCS5Padding 으로 암/복호화 할려고 구현했는데 MySQL과 동기화가 필요했기 때문에 ...
어쩔수 없이 AES 기본 값으로 변경해야 가능합니다.
AES/CBC/PKCS5Padding 를
AES/ECB/PKCS5Padding 로 변경하니 성공..
Java AES + CBC 암호화 샘플 코드 ECB로 바꾸는 자바 샘플은 위 링크에서 IV Parameter를 제거하고 모드만 바꾸면 끝납니다.

MySQL 암호/복호화 테스트

UPDATE Foo Set Bar = TO_BASE64((AES_ENCRYPT(Bar, unhex('hex대칭키')))) WHERE Bar = 'hello';

SELECT (AES_DECRYPT(FROM_BASE64(Bar), unhex('hex대칭키'))) FROM Foo WHERE Bar = 'hello';
- 다른 샘플들을 살펴보면 데이터에 hex를 썻는데 저는 자바코드에서 aes후 base 64를 쓰기 때문에
MySQL도 암호화 로직 순서대로 동일하게 구현하였습니다.
http://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_from-base64

- 대칭키도 byte로 받다보니 자바에서 hex시킨 대칭키 문자열을 다시 unhex해서 넣었습니다. (unhex 부분은 키 값이 hex가 아니라면 쓰지 않으면 됩니다)

'Java' 카테고리의 다른 글

모델 클래스에 인터페이스 구현 설계에 대한 내용  (0) 2016.08.24
package javax.crypto does not exist  (0) 2016.08.17
AES 암호화/복호화  (0) 2016.08.02
Bit 연산  (0) 2016.03.21
[Jar] jar 파일 내부 리스트 보기  (0) 2016.01.29