정의
- Java에서의 암호화 및 복호화 기능을 제공하며 JCE framework의 핵심을 구성
- Java Cryptography Extension(JCE) = Java 보안 기능의 핵심을 담당하는 Java Crpytography Architecture(JCA)의 일부분으로, 애플리케이션에서 데이터 암호화, 복호화 그리고 개인 데이터의 해싱을 제공
- 암호학에서 원본 = Plaintext, 암호화된 문서 = Ciphertext라 부름
- getInstance()에 "알고리즘/모드/패딩" 형식으로 파라미터를 입력해 암호화 방식을 지정하여 인스턴스 생성
지원 알고리즘 종류
대칭 알고리즘
- AES (Advanced Encryption Standard) - 가장 일반적
- DES (Data Encryption Standard)
- 3DES (Triple DES)
- Blowfish
비대칭 알고리즘
- RSA (Rivest-Shamir-Adleman)
- ECIES (Elliptic Curve Integrated Encryption Scheme)
- DH (Diffie-Hellman)
- ECDH (Elliptic Curve Diffie-Hellman)
암호화 알고리즘 종류
대칭 알고리즘 DES (Data Encryption Standard, 데이터 암호화 표준) 1970년대에 IBM에서 개발한 AES 도입 이전까지의 표준 대칭 키 암호화 알고리즘 블록 크기가 64 bit (8 byte), 키 크기가 56 bit (7byte)로 고정
coding789.tistory.com
지원 모드 종류
- None
- ECB (Electric Codebook)
- CBC (Cipher Block Chaining)
- CFB (Cipher Feedback)
- CTR (Counter)
- CTS (Cipher Text Stealing)
- OFB (Output Feedback)
- PCBC (Propagating Cipher Block Chaining)
블록 암호화 기법 종류
ECB (Electronic Code Book) 평문을 일정한 블록 단위로 나누어 순차적으로 암호화하는 구조로 가장 단순한 기법 동일한 평문 블록에 대해 동일한 암호문 블록이 생성 각각의 블록은 서로 독립적이며
coding789.tistory.com
지원 패딩 종류
- NoPadding
- ISO10126Padding
- OAEPPadding(Optimal Asymmetric Encryption Padding) - RSA와 같이 사용
- PKCS1Padding - 비대칭 알고리즘(RSA)과 같이 사용
- PKCS5Padding - 대칭 알고리즘과 같이 사용
- SSL3Padding
암호화 패딩 종류
패딩(Padding) 암호화에서 사용되는 기술 중 하나로 평문을 암호화하기 전에 일정한 규칙에 따라 데이터의 길이를 조정하는 과정 주로 블록 암호화에서 사용되며 평문의 길이가 블록 크기의 배수
coding789.tistory.com
기본 세팅
public class cipherUtil {
// "알고리즘/모드/패딩" -> 알고리즘인 AES만 입력 시 보안에 취약한 ECB 패딩이 적용
public static String alg = "AES/CBC/PKCS5Padding";
// 개인 키
private final String key = "암호화 키(32글자)"; // 256비트(32바이트)
// 초기화 벡터(IV) 설정을 위한 파라미터 -> 보안성 ↑
private String iv = "초기화 벡터(16글자)"; // 128비트(16바이트)
public String encrypt(String text) throws Exception {
// 인스턴스 생성
Cipher cipher = Cipher.getInstance(alg);
// SecretKeySpec -> 암호화 키 설정에 사용
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
// 초기화 벡터(IV) 설정
IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
// 암호화 설정
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParamSpec);
// AES 인코딩 (doFinal은 파라미터 타입이 byte[])
byte[] encrypted = cipher.doFinal(text.getBytes("UTF-8"));
// String으로 사용하기 위해 Base64 인코딩 후 String으로 변환
return Base64.getEncoder().encodeToString(encrypted);
}
public String decrypt(String cipherText) throws Exception {
// 인스턴스 생성
Cipher cipher = Cipher.getInstance(alg);
// SecretKeySpec -> 암호화 키 설정에 사용
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
// 초기화 벡터(IV) 설정
IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
// 복호화 설정
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParamSpec);
// Base64 디코딩 (String -> byte[])
byte[] decodedBytes = Base64.getDecoder().decode(cipherText);
// AES 디코딩
byte[] decrypted = cipher.doFinal(decodedBytes);
// 디코딩 결과값 String으로 변환
return new String(decrypted, "UTF-8");
}
}
- Cipher.getInstance("알고리즘/모드/패딩") = 암호화 알고리즘/모드/패딩 지정하여 Cipher 객체 생성
- javax.crypto.spec.SecretKeySpec = 비밀 키 생성 클래스
- javax.crypto.spec.IvParameterSpec = 초기화 벡터(IV) 생성 클래스 (DES, CBC, RSA, OAEP 등에서 필요)
- cipher.init(작동 모드, 비밀키, 초기화 벡터-선택) = 해당 작동 모드로 Cipher 객체 초기화
(작동 모드는 Cipher.ENCRYPT_MODE와 같이 상수 입력)
작동 모드 종류 = ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE, UNWRAP_MODE - cipher.doFinal() = 암호화/복호화 작업 수행 (파라미터 및 결과값 타입 = byte[])
- Base64.getEncoder().encodeToString(encrypted) = String으로 사용 위해 Base64 인코딩 후 String으로 변환
Base64.getDecoder().decode() = Base64로 암호화 된 데이터 디코딩
Base64
- 바이트 데이터를 텍스트 데이터(Byte[] ↔ String) 형식으로 인코딩 및 디코딩하기 위한 방식 중 하나
- ASCII(아스키 코드) 중에서 제어 문자와 일부 특수문자를 제외하여 URL 상에서 안전한 문자들로 구성되어 있기 때문에 가장 보편적으로 사용됨
'Java > 암호화' 카테고리의 다른 글
암호화 패딩 종류 (0) | 2024.03.18 |
---|---|
블록 암호화 기법 종류 (0) | 2024.03.18 |
암호화 알고리즘 종류 (0) | 2024.03.18 |
Jasypt (application.properties 암호화) (0) | 2024.02.28 |
댓글