본문 바로가기
Spring/SpringBoot

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

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

안녕하세요. J4J입니다.

 

이번 포스팅은 Oracle과 동일한 AES 암호화하는 방법에 대해 적어보는 시간을 가져보려고 합니다.

 

 

 

Oracle AES 암호화

 

먼저 Oracle에서 AES 암호화하는 Function을 만들어주겠습니다.

 

암호화해주는 Function은 다음과 같이 작성해서 생성해줍니다.

 

create or replace FUNCTION AES_ENCRYPTION (text IN VARCHAR2)
RETURN VARCHAR2
IS
    secret_key VARCHAR(32) := '12345678901234567890123456789012'; -- 비밀키
    
    encrypted_raw RAW (2000);
    key_bytes_raw RAW (32);
    encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256 + 
                                   DBMS_CRYPTO.CHAIN_CBC + 
                                   DBMS_CRYPTO.PAD_PKCS5;

BEGIN
    key_bytes_raw := UTL_I18N.STRING_TO_RAW(secret_key, 'AL32UTF8');
    encrypted_raw := DBMS_CRYPTO.ENCRYPT(src => UTL_I18N.STRING_TO_RAW (text, 'AL32UTF8'),
                                         typ => encryption_type,
                                         key => key_bytes_raw);

RETURN UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(encrypted_raw));

END AES_ENCRYPTION;

 

 

 

복호화해주는 Function은 다음과 같이 작성해서 생성해줍니다.

 

create or replace FUNCTION AES_DECRYPTION (encrypted_text IN VARCHAR2)
RETURN VARCHAR2
IS
    secret_key VARCHAR(32) := '12345678901234567890123456789012'; -- 비밀키

    decrypted_raw RAW (2000);
    key_bytes_raw RAW (32);
    decryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256 + 
                                   DBMS_CRYPTO.CHAIN_CBC + 
                                   DBMS_CRYPTO.PAD_PKCS5;

BEGIN
    key_bytes_raw := UTL_I18N.STRING_TO_RAW(secret_key, 'AL32UTF8');
    decrypted_raw := DBMS_CRYPTO.DECRYPT(src => UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(encrypted_text)),
                                         typ => decryption_type,
                                         key => key_bytes_raw);

RETURN UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8');

END AES_DECRYPTION;

 

 

반응형

 

 

Function을 모두 만들었다면 정상적으로 동작되는지 테스트해보겠습니다.

 

"oracle-spring"이라는 평문을 가지고 암복호화한 값이 다음과 같이 나오는 것을 확인할 수 있습니다.

 

실행 결과

 

 

 

Spring AES 암호화

 

이번엔 위에서 만든 Oracle AES 암호화와 동일한 결과를 만들어내는 Spring 코드를 작성해보겠습니다.

 

package com.spring.aes.util;

import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.springframework.stereotype.Component;

@Component
public class Aes {
	
	private String secretKey = "12345678901234567890123456789012"; // 비밀키
	
	// 암호화
	public String encryption(String text) {
		try {
			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
			cipher.init(Cipher.ENCRYPT_MODE,
						new SecretKeySpec(secretKey.getBytes(), "AES"),
						new IvParameterSpec(new byte[16]));
			
			return new String(Base64.getEncoder().encode(cipher.doFinal(text.getBytes("UTF-8"))));
		} catch(Exception e) {
			return text;
		}
	}
	
	// 복호화
	public String decryption(String encryptedText) {
		try {
			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
			cipher.init(Cipher.DECRYPT_MODE,
						new SecretKeySpec(secretKey.getBytes(), "AES"),
						new IvParameterSpec(new byte[16]));
			
			return new String(cipher.doFinal(Base64.getDecoder().decode(encryptedText.getBytes("UTF-8"))));
		} catch(Exception e) {
			return encryptedText;
		}
	}
}

 

 

728x90

 

 

코드를 모두 작성했다면 Oracle과 동일한 결과가 나오는지 단위 테스트를 작성해서 테스트해보겠습니다.

 

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("oracle-spring"));
		log.info(aes.decryption("VgBxHhzcvkFIpizGhWX9aQ=="));
	}
}

 

 

 

결과는 다음과 같이 나오는 것을 확인할 수 있었고 동일한 암복호화가 이루어진것도 확인할 수 있었습니다.

 

실행 결과

 

 

 

 

 

 

 

이상으로 Oracle과 동일한 AES 암호화하는 방법에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

 

 

 

728x90
반응형

댓글