AES256

- Advanced Encryption Standard 의 줄임말

- 256비트 길이의 키를 사용하는 암호화 알고리즘

- 대칭키 암호화

- 높은 보안성

- 속도가 빠름

 

 

 AES 개인키 설정

private final static String privateKey = "worldProject1234";

 

위는 그냥 자바 문자열로 선언해두었지만, 환경설정 파일에 세팅한 값을 불러올 수도 있다

 

 

AES 암복호화

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.apache.commons.codec.binary.Hex;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

@Slf4j
@Component
public class AESUtil {

    private final static String privateKey = "{16바이트 개인키 설정}";

    private final static String IVparam = "{16바이트 IV값 설정}";
    private final static String UTF8 = "UTF-8";
    private final static String AES = "AES";
    private final static String AESInstance = "AES/CBC/PKCS5Padding";

    public static String encrypt(String str) {
        try {
            SecretKeySpec secretKey = new SecretKeySpec(privateKey.getBytes(UTF8), AES);
            IvParameterSpec IV = new IvParameterSpec(IVparam.getBytes(UTF8));

            Cipher c = Cipher.getInstance(AESInstance);

            c.init(Cipher.ENCRYPT_MODE, secretKey, IV);

            byte[] encrypte = c.doFinal(str.getBytes(StandardCharsets.UTF_8));

            return Hex.encodeHexString(encrypte);

        } catch (Exception e) {
            log.error("Error while encrypt: {}", e);
            return null;
        }
    }

    public static String decrypt(String str) {
        try {
            SecretKeySpec secretKey = new SecretKeySpec(privateKey.getBytes(UTF8), AES);
            IvParameterSpec IV = new IvParameterSpec(IVparam.getBytes(UTF8));

            Cipher c = Cipher.getInstance(AESInstance);

            c.init(Cipher.DECRYPT_MODE, secretKey, IV);

            byte[] decode = Hex.decodeHex(str.toCharArray());

            return new String(c.doFinal(decode), UTF8);

        } catch (Exception e) {
            log.error("Error while decrypt: {}", e);
            return null;
        }
    }
}

 

 

 

Hex 의 경우 추가로 라이브러리가 필요할 수 있다

implementation group: 'commons-codec', name: 'commons-codec', version: '1.15'

 

 

 

암복호화가 잘 되는지 테스트

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

class AESUtilTest {

    final String test = "test1234";
    final String aesTest = "7b0934575f6e21a322912bb3adda16da";

    @Test
    void encrypt() {
        Assertions.assertEquals(AESUtil.encrypt(test), aesTest);
    }

    @Test
    void decrypt() {
        Assertions.assertEquals(AESUtil.decrypt(aesTest), test);
    }
}

'Dev Back > JAVA' 카테고리의 다른 글

[adoc] 한글이 깨지는 이슈  (1) 2024.07.03
[JAVA] 접근 제어자의 종류와 사용법  (0) 2024.06.26
[JAVA] @Valid  (0) 2024.06.11
[JAVA] 인텔리제이 자바 빌드 버전 바꾸기  (0) 2024.05.28
[JAVA] @JsonProperty  (0) 2024.05.27

+ Recent posts