Cipher 클래스는 Java에서 암호화와 복호화를 담당한다
javax.crypto pakage에 위치해서 암호화 및 복호화 기능을 제공
JCE framework의 핵심을 구성
JCE란 Java Cryptography Extension : 자바 보안 기능의 핵심을 담당하는 Java Crpytography Architectur(JCA)의 일부분으로, 애플리케이션에서 데이터 암호화, 복호화 그리고 개인 데이터의 해싱을 제공한다.
사용법
암호화
// 암호화
public String aesEncode(String str) throws Exception{
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes()));
byte[] encrypted = c.doFinal(str.getBytes(ENCODING_TYPE));
String enStr = new String(Base64.encodeBase64(encrypted));
return enStr;
}
복호화
//복호화
public String aesDecode(String str) throws Exception {
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes(ENCODING_TYPE)));
byte[] byteStr = Base64.decodeBase64(str.getBytes());
return new String(c.doFinal(byteStr),ENCODING_TYPE);
}
1. 객체 인스턴스화
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
getInstance 메서드에 Cipher 객체를 AES 암호화, CBC operation mode, PKCS5 padding scheme로 초기화하라고 요청하는 코드
2. Key 생성
@PostConstruct
public void init() throws UnsupportedEncodingException{
this.iv = AES_KEY.substring(0, 16);
byte[] keyBytes = new byte[16];
byte[] b = AES_KEY.getBytes(ENCODING_TYPE);
int len = b.length;
if(len > keyBytes.length)
len = keyBytes.length;
System.arraycopy(b, 0, keyBytes, 0, len);
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
this.keySpec = keySpec;
}
여기서 AES_KEY는 properties 파일에서 가져온 상수
Key 인터페이스는 암호화 작업들을 위한 키들을 나타낸다. Keys는 인코딩된 키, 키의 인코딩 포맷, 암호화 알고리즘을 포함하는 불투명한 컨테이너이다.
키는 일반적으로 키 팩토리를 사용하는 key generators, certificates, 또는 key specifications를 통해서 획득한다.
keyBytes로 부터 양방향 키를 생성
3. 초기화
Cipher 객체를 초기화하기 위해서 키 또는 증명서(Certificate)
그리고 Cipher의 작동 모드를 나타내는 opmode와 함께 init() 메서드를 호출한다
선택적으로 랜덤과 관련된 소스를 전달할 수 있음.
기본적으로 가장 높은 우선 순위로 설치된 provider의 SecureRandom 구현이 사용됨.
알고리즘 별 매개 변수 세트를 선택적으로 지정할 수도 있음.
해당 코드에서는 IvParameterSpec을 전달하여 초기화 벡터를 지정.
이용 가능한 cipher 작업 모드 목록
1. ENCRYPT_MODE: cipher 객체를 암호화 모드로 초기화한다.
2. DECRYPT_MODE: cipher 객체를 복호화 모드로 초기화한다.
3. WRAP_MODE: cipher 객체를 key-wrapping 모드로 초기화한다.
4. UNWRAP_MODE: cipher 객체를 key-unwrapping 모드로 초기화한다.
4-1. 암호화
byte[] encrypted = c.doFinal(str.getBytes(ENCODING_TYPE))
암호화를 수행하는 부분.
주어진 문자열을 바이트 배열로 변환한 후, Cipher 객체의 doFinal 메서드를 사용하여 암호화/복호화 진행
String enStr = new String(Base64.encodeBase64(encrypted)): 암호화된 결과를 Base64로 인코딩하여 문자열로 변환
바이트 배열을 문자열로 변환
4-2. 복호화
byte[] byteStr = Base64.decodeBase64(str.getBytes()): Base64로 인코딩된 문자열을 바이트 배열로 디코딩하여 byteStr에 저장
return new String(c.doFinal(byteStr), ENCODING_TYPE): Cipher 객체의 doFinal 메서드를 사용하여 복호화를 진행
그 결과를 지정된 문자 인코딩(ENCODING_TYPE)으로 디코딩하여 반환
'Java' 카테고리의 다른 글
Try-Catch 자동 close (0) | 2024.02.26 |
---|---|
URI, URL, ContentPath, RemoteAddr 출력 (0) | 2024.02.22 |