들어가며
자바 JCE 관련 에러를 해결하면서 JCE 정책에 대해 자세하게 알아보고 싶었다.
일단 간단하게 찾아보니까 자바 암호화 패키지에 두 종류가 있다고 하여 같이 정리하려 한다.
JCA (Java Cryptography Architecture) 와 JCE (Java Cryptography Extension) 이렇게 두 종류가 있다.
1. JCA
- 'Provider' 아키텍처를 사용하고 디지털 서명, 메시지 다이제스트(해시), 인증서 및 인증서 검증, 암호화(대칭/비대칭 블록/스트림 암호), 키 생성 및 관리, 보안 난수 생성 등을 위한 API를 포함한다.
- JCA는 구현 독립성, 구현 호환성, 알고리즘 확장성을 중심으로 설계되었다.
- 구현 독립성: 보안 기능별 독립된 제공자(Provider)로 구현
- 구현 호환성: 프로그램들간 추상화된(고정되지 않은) 제공자를 통해서 호환
예를 들어, 동일한 알고리즘의 경우 한 공급자가 생성한 키는 다른 공급자가 사용할 수 있고, 한 공급자가 생성한 서명은 다른 공급자가 검증할 수 있음을 의미합니다. - 알고리즘 확장성: 새로운 알고리즘을 쉽게 추가할 수 있음
- JDK 1.4 이상에서는 JCE(Java Cryptography Extention)도 기본적으로 포함된다.
- 모든 보안 공급자의 기본 클래스: java.security.Provider
- 각 CSP에는 공급자의 이름과 구현하는 모든 보안 서비스/알고리즘을 가진 이 클래스의 인스턴스가 포함됨
- 특정 알고리즘의 인스턴스가 필요할 때 JCA 프레임워크는 공급자의 데이터베이스를 참조하고 적합한 일치 항목이 발견되면 인스턴스를 생성함
* 암호화 서비스 공급자(CSP): 디지털 서명 알고리즘, 메시지 다이제스트 알고리즘, 키 변환 서비스와 같은 하나 이상의 암호화 서비스를 구현하는 패키지 또는 패키지 세트를 말한다(공식 문서에서는 "Provider"와 혼용됨)
다양한 메시지 다이제스트 알고리즘("SHA-256", "SHA-384" 및 "SHA-512")을 구현하는 세 가지 다른 공급자가 존재한다. 공급자는 왼쪽에서 오른쪽으로(1-3) 선호도에 따라 정렬된다.
md = MessageDigest.getInstance("SHA-256");
md = MessageDigest.getInstance("SHA-256", "ProviderC");
그림 1a 에서는 애플리케이션이 공급자 이름을 지정하지 않고 SHA-256 알고리즘 구현을 요청한다. 공급자는 선호도 순서대로 검색되고 해당 알고리즘을 제공하는 첫번째 공급자인 ProviderB의 구현이 반환된다.
그림 1b에서는 애플리케이션이 ProviderC에게 SHA-256 알고리즘 구현을 요청한다. 이번에는 선호도 순서가 더 높은 공급자인 ProviderB가 SHA-256 구현을 제공하더라도 ProviderC의 구현이 반환된다.
이처럼 어플리케이션은 'Provider Framework'를 통해서 각각의 독립적인 'Provider'에 접근해서 암호 기능을 구현할 수 있다.
JCA의 키 관리
- "Keystore" 라고 하는 키와 인증서의 저장소를 관리하는 DB가 존재한다.
- java.security,KeyStore 클래스에 .jls 파일 형태로 구현된다.
- 어플리케이션은 각각의 'Provider'로부터 개별적인 keystore 구현이 가능하다.
주요 클래스
클래스명 | 설명 |
Provider | 기본 Provider 클래스 |
Security | Provider 및 Security Property 관리 |
SecureRandom | 랜덤 숫자 생성 |
MessageDigest | 지정된 데이터의 메시지 다이제스트(해시) 계산 |
Signature | 전자 서명 및 검증 |
Cipher | 데이터 암/복호화에 사용됨 대칭 암호화(AES), 비대칭 암호화(RSA), 비밀번호 기반 암호화(PBE) 포함 |
Message Authentication Codes (MAC) | MessageDigest와 유사하게 해시 값을 생성하지만, 메시지의 무결성을 보호하기 위해 먼저 키로 초기화 됨 |
KeyFactory | 키 타입 변환 |
SecretKeyFactory | 대칭키 타입 변환 |
KeyPairGenerator | 공개키/개인키 생성 |
KeyGenerator | 대칭키 생성 |
KeyAgreement | 키 교환 정보 |
AlgorithmParameters | 알고리즘 파라미터 암/복호화 |
AlgorithmParameterGenerator | 알고리즘 파라미터 생성 |
KeyStore | Keystore 생성 및 관리 신뢰할 수 있는 인증서도 포함 Keystore의 개인 키는 해당 공개 키를 인증하는 인증서 체인이 연결됨 |
CertificateFactory | 인증서, 인증서폐기목록(CRL) 생성 |
CertPathBuilder | 인증서 체인 생성 |
CertPathValidator | 인증서 체인 검증 |
CertStore | 인증서, 인증서폐기목록(CRL) 관리 |
2. JCE
JCE는 JCA보다 더 강력한 확장된 보안 기능을 제공한다. 미국에서 보안상 이유로 2000년 이후에 해외로 보급되었다고 한다.
- JCA( java.security 패키지)와 JCE( javax.crypto 패키지)는 분리되어 있다.
- 하지만 JCA가 더 큰 범위, 그 안에 JCE가 포함되어 있다고 볼 수 있다.
- JDK1.4 이상부터는 모두 기본으로 포함된다.
- JCE에 포함되는 클래스: Cipher, KeyGenerator, SecretKeyFactor, KeyAgreement, MAC 등
Java Cryptographic Service Provider 종류
- SunJCE: Java의 기본 암호화 제공자로, 대칭 및 비대칭 암호화 알고리즘 지원. AES, DES, RSA 등의 알고리즘 포함
- SunRsaSign: RSA 서명 알고리즘을 구현하는 제공자로, 디지털 서명 및 인증서 생성
- SunJSSE: Java Secure Socket Extension의 제공자로, SSL/TLS 프로토콜을 통해 안전한 통신 지원
- Bouncy Castle: 오픈 소스 암호화 라이브러리로, 다양한 암호화 알고리즘과 프로토콜 지원. Java에서 사용할 수 있는 추가적인 암호화 기능 제공
- IBMJCE: IBM에서 제공하는 암호화 서비스로, IBM의 보안 솔루션과 통합되어 사용됨. 다양한 보안 알고리즘 지원
SunJCE vs Bouncy Castle
특성 | SunJCE | Bouncy Castle |
표준화 | Java SE에 기본 포함되어 있어 사용이 간편함 | 다양한 알고리즘과 기능을 지원함 |
성능 | JVM 최적화로 성능이 우수함 | 다양한 최적화가 가능하지만, 성능은 알고리즘에 따라 다름 |
문서화 | Oracle의 공식 문서가 잘 정리되어 있음 | 활발한 커뮤니티와 문서가 존재함 |
알고리즘 지원 | 지원하는 알고리즘이 제한적일 수 있음 | 매우 많은 알고리즘을 지원하지만, 복잡할 수 있음 |
업데이트 | 업데이트가 느릴 수 있음 | 자주 업데이트되며 최신 알고리즘을 지원함 |
사용 용이성 | API가 간단하고 직관적임 | API가 복잡할 수 있어 학습 곡선이 있음 |
가장 인상 깊었던 게 Bouncy Castle은 아무 제한 없이 사용가능하다는 것이다. 이전에 JCE 정책 키 제한 문제를 겪었는데, CSP 종류에 따라 제한이 결정되는 게 신기했다. 또한 SunJCE는 Provider를 직접 선택할 수 있다고 한다.마지막으로 Bouncy Castle이 SEED 128 알고리즘(국산암호알고리즘)을 제공해 다양한 곳에서 사용할 수 있다는 장점이 있다.
마치며
자바 암호화 패키지 JCA, JCE에 대해 알아보았다.
느리지만 조금씩 배우며 내꺼로 만들면서 쌓아가는 게 중요하다고 생각한다. 그렇기에 이런 작은 기록도 소중한 걸로!
참고
댓글