본문 바로가기
Spring/SpringBoot

[SpringBoot] MySQL과 동일한 AES 암호화하기

by J4J 2022. 7. 25.
300x250
반응형

안녕하세요. 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;
		}
	}
}

 

 

728x90

 

 

위와 같이 코드를 작성한 뒤 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 암호화하는 방법에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

 

 

 

728x90
반응형

댓글