안녕하세요. J4J입니다.
이번 포스팅은 MySQL과 동일한 AES 암호화하는 방법에 대해 적어보는 시간을 가져보려고 합니다.
MySQL AES 암호화
MySQL에서 AES 암호화를 도와주는 Function을 만들려고 합니다.
아래와 같이 MySQL에서 제공해주는 aes_encrypt를 활용하여 암호화를 해주는 aes_encryption Function을 만들어줄 수 있습니다.
CREATE FUNCTION `aes_encryption`(p_text varchar(100))
RETURNS varchar(100) CHARSET utf8
BEGIN
declare v_encrypted_text varchar(100);
select hex(aes_encrypt(p_text, '1234567890'))
into v_encrypted_text;
if(v_encrypted_text is null) then
set v_encrypted_text = p_text;
end if;
RETURN v_encrypted_text;
END
또한 복호화하는 Function도 만들어줍니다.
이번엔 MySQL에서 제공해주는 aes_decrypt를 활용하여 복호화를 해주는 aes_decryption Function을 만들어줍니다.
CREATE FUNCTION `aes_decryption`(p_encrypted_text varchar(100))
RETURNS varchar(100) CHARSET utf8
BEGIN
declare v_text varchar(100);
select aes_decrypt(unhex(p_encrypted_text), '1234567890')
into v_text;
if(v_text is null) then
set v_text = p_encrypted_text;
end if;
RETURN v_text;
END
Function을 모두 만들어놨다면 정상적으로 동작하는지 테스트해보겠습니다.
"mysql-spring"이라는 평문을 활용하여 다음과 같은 결과가 나오는 것을 확인할 수 있습니다.
Spring AES 암호화
이번엔 위에서 만들어둔 MySQL과 동일한 결과를 만들어내는 AES 암호화를 Spring에도 구현하려고 합니다.
다음 순서를 따라 암복호화를 해주는 메서드를 만들어서 테스트해보도록 하겠습니다.
[ 1. dependency 추가 ]
<!-- AES 암호화 -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
[ 2. 암복호화 파일 작성 ]
package com.spring.aes.util;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Hex;
import org.springframework.stereotype.Component;
@Component
public class Aes {
private String secretKey = "1234567890"; // 비밀키
// 암호화
public String encryption(String text) {
try {
Cipher cipher = Cipher.getInstance("AES");
byte[] key = new byte[16];
int i = 0;
for(byte b : secretKey.getBytes()) {
key[i++%16] ^= b;
}
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"));
return new String(Hex.encodeHex(cipher.doFinal(text.getBytes("UTF-8")))).toUpperCase();
} catch(Exception e) {
return text;
}
}
// 복호화
public String decryption(String encryptedText) {
try {
Cipher cipher = Cipher.getInstance("AES");
byte[] key = new byte[16];
int i = 0;
for(byte b : secretKey.getBytes()) {
key[i++%16] ^= b;
}
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "AES"));
return new String(cipher.doFinal(Hex.decodeHex(encryptedText.toCharArray())));
} catch(Exception e) {
return encryptedText;
}
}
}
위와 같이 코드를 작성한 뒤 MySQL과 동일한 결과를 만들어내는지 "mysql-spring" 이라는 평문을 이용하여 테스트를 해보겠습니다.
다음과 같이 단위 테스트를 작성하여 실행해보겠습니다.
package com.spring.aes;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.spring.aes.util.Aes;
import lombok.extern.slf4j.Slf4j;
@SpringBootTest
@Slf4j
class AesTest {
@Autowired
Aes aes;
@Test
void aesTest() {
log.info(aes.encryption("mysql-spring"));
log.info(aes.decryption("C1BC5587BDD9DA75EA0DD401CC2851D0"));
}
}
실행한 결과는 다음과 같이 나왔고 MySQL과 동일한 AES 암호화를 하는 것을 확인할 수 있습니다.
이상으로 MySQL과 동일한 AES 암호화하는 방법에 대해 간단하게 알아보는 시간이었습니다.
읽어주셔서 감사합니다.
'Spring > SpringBoot' 카테고리의 다른 글
[SpringBoot] QueryDSL에서 상수값 사용하기 (0) | 2022.09.26 |
---|---|
[SpringBoot] Oracle과 동일한 AES 암호화하기 (0) | 2022.07.30 |
[SpringBoot] QueryDSL Projections로 결과값 핸들링하기 (0) | 2022.07.09 |
[SpringBoot] Found shared references to a collection 에러 (0) | 2022.06.13 |
[SpringBoot] JPA에서 QueryDSL 사용하기 (0) | 2022.04.24 |
댓글