// key를 byte로 변환하여 16byte의 길이만큼 복사한 값을 IV로 사용
private final String iv = key.substring(0, 16); // 16byte
IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
getBytes
유니코드 문자열(String)을 바이트코드로 인코딩 해주는 메소드
(byte[] 형태로 리턴됨)
// 1. Cipher 객체를 AES 알고리즘으로 암호화 & CBC operation mode & PKCS5 padding scheme로 초기화
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// 2. 변환 알고리즘만 명시하여 초기화도 가능
Cipher cipher = Cipher.getInstance("AES");
String key = "키값";
SecretKey secretKey = new SecretKeySpec(key.getBytes(), "AES");
secretKey의 길이에 따라 암호화 방식이 변경됨
32bit : AES-256
24bit : AES-192
24bit : AES-128
// key를 16byte로 자르기
String iv = key.substring(0, 16); // 16byte
IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
// 작동 모드 & 키 & 초기화 벡터(IV) - CBC
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParamSpec);
// 작동 모드 & 키 - ECB
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
getPublicKey() 메서드를 호출하여 인증서(certificate)로 부터 공용키를 얻음
// text = 암호화 할 텍스트
byte[] encrypted = cipher.doFinal(text.getBytes("UTF-8"));
// 64bit로 인코딩
Base64.getEncoder().encodeToString(encrypted);
byte: 8bit 2진법(0 or 1)
Hex digits: 16bit
base64: 64bit
// Cipher 객체를 인스턴스화 (원하는 변환 형태의 이름을 전달)
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// 평문을 암호화 하기 위해 secretKey 생성
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
// 초기화 벡터 생성
IvParameterSpec ivParamSpec = new IvParameterSpec(key.substring(0, 16).getBytes());
// 인코딩 모드로 세팅
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParamSpec);
// 암호화할 텍스트
String text = "01012345678";
// 암호화
byte[] encrypted = cipher.doFinal(text.getBytes("UTF-8"));
// 64bit 로 인코딩
Base64.getEncoder().encodeToString(encrypted);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivParamSpec = new IvParameterSpec(key.substring(0, 16).getBytes());
// 디코딩 모드로 세팅
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParamSpec);
// 복호화
byte[] encrypted = cipher.doFinal(Base64.getDecoder().decode(encText));
new String(encrypted);
// Cipher 객체를 인스턴스화 (원하는 변환 형태의 이름을 전달)
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
// 평문을 암호화 하기 위해 secretKey 생성
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
// 인코딩 모드로 세팅
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParamSpec);
// 암호화할 텍스트
String text = "01012345678";
// 암호화
byte[] encrypted = cipher.doFinal(text.getBytes("UTF-8"));
// 64bit 로 인코딩
Base64.getEncoder().encodeToString(encrypted);
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
// 디코딩 모드로 세팅
cipher.init(Cipher.DECRYPT_MODE, keySpec);
// 복호화
byte[] encrypted = cipher.doFinal(Base64.getDecoder().decode(encText));
new String(encrypted);
SELECT @@block_encryption_mode;
SET block_encryption_mode = 'aes-256-cbc';
SELECT to_base64(AES_ENCRYPT(암호화할 텍스트, key, iv));
SELECT AES_DECRYPT(FROM_BASE64(복호화할 텍스트), key, iv)
// PageRequest.of(페이지넘버, 사이즈, sort여부)
PageRequest.of(0, 15, Sort.by("id").accending())
Sort idSort = Sort.by("id").ascending()
Sort dateSort = Sort.by("createDate").descending()
idSort.and(dateSort)
// ivHash의 index 16까지 복사
Arrays.copyOf(ivHash, 16);
aes:
key: "비밀키"
@Component
public class AES256 {
@Value("${aes.key}")
private String key;