Tech/Java

자바 암호화 패키지(JCA,JCE)란?

봄의 개발자 2024. 12. 9.
반응형

들어가며

 

[Java] java.security.InvalidKeyException: Illegal key size or default parameters  : Model has no value for key 에러 해결

들어가며AES 256 암복호화 코드를 구현하고 이를 사용하는 도중에 에러가 발생했다. 처음에는 구현한 코드의 문제라고 생각을 했는데, 구글리을 해보니 자바의 문제였다. 이는 보통 자바에서 대

ssonzm.tistory.com

자바 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"와 혼용됨)

 

https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html

다양한 메시지 다이제스트 알고리즘("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년 이후에 해외로 보급되었다고 한다.

https://itbj.tistory.com/2

 

  • 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에 대해 알아보았다.

느리지만 조금씩 배우며 내꺼로 만들면서 쌓아가는 게 중요하다고 생각한다. 그렇기에 이런 작은 기록도 소중한 걸로!

 

참고

반응형

댓글