개요
이번 글에서는 자바에서 AES-256 암호화를 사용하는 방법에 대해 소개해보려고 한다.
AES-256이란?
우선 AES는 고급 암호 표준(Advanced Encryption Standard)을 의미한다.
대칭키를 쓰는 블럭 암호로 높은 안전성과 속도로 인해 인기를 얻어 전 세계적으로 사용되고 있다.
또 암호화 블럭 크기가 128 bit 이며 암호화 키의 길이가 128, 192, 256 bit인 세 가지 종류가 AES 표준 으로 지정되었다.
각각 AES-128, AES-192, AES-256으로 불린다. 이 중 이번글에서 다룰 내용은 AES-256이다.
언제 사용할까?
필자는 사용자의 계정 비밀번호나 거주지, 이름 등과 같은 민감한 개인정보들을 DB에 INSERT 하기 전에 암호화하고 이후에 다시 데이터들을 운영툴 같은 곳에서 다시 다뤄야할 때 복호화하여 사용하곤 한다.
Java에서 AES-256 사용하기
import org.springframework.stereotype.Component;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
@Component
public class AES256 {
public static String alg = "AES/CBC/PKCS5Padding";
private final String key = "01234567890123456789012345678901";
private final String iv = key.substring(0, 16); // 16byte
public String encrypt(String text) throws Exception {
Cipher cipher = Cipher.getInstance(alg);
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParamSpec);
byte[] encrypted = cipher.doFinal(text.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(encrypted);
}
public String decrypt(String cipherText) throws Exception {
Cipher cipher = Cipher.getInstance(alg);
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParamSpec);
byte[] decodedBytes = Base64.getDecoder().decode(cipherText);
byte[] decrypted = cipher.doFinal(decodedBytes);
return new String(decrypted, "UTF-8");
}
}
위와 같이 AES-256 클래스를 작성한 후
final String hello = "hello";
System.out.println(aes256.encrypt(hello));
System.out.println(aes256.decrypt(aes256.encrypt(hello)));
암/복호화를 시도해보면

사진과 같이 정상적으로 암/복호화가 이루어지는 것을 확인할 수 있다.
'Java' 카테고리의 다른 글
| [Java] Java - 비밀번호 유효성 체크 유틸 (0) | 2022.08.29 |
|---|---|
| [Java] Java - System.lineSeparator() 매서드 (0) | 2022.08.25 |
| [Java] Java Collection Framework - List, Set, Map (0) | 2022.05.03 |
| [Java] String 클래스에 대하여 (0) | 2022.04.04 |
| [Java] 변수의 타입 - 기본형(Primitive type)/참조형(Reference type) (0) | 2022.03.31 |