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 |