비대칭키를 이용한 인증서 생성 - (3) 실무 코드 정리

단비·2023년 5월 9일
0

학습

목록 보기
42/66

인증서 가져오기

CertificateFactory
지정된 타입의 CertificateFactory 객체를 작성해, 지정된 프로바이더를 구현 (SPI 객체)


-1: 저장된 인증서 / -2: String값

1. getInstance(문자열 알고리즘)

  • 지정된 인증서 유형을 구현하는 인증서 팩토리 객체를 반환
// 공개키 유형의 X.509를 이용
CertificateFactory cf = CertificateFactory.getInstance("X.509");

2-1. 파일 읽기

FileInputStream in = new FileInputStream(파일경로);

2-2. String inputStream에 담기

  • 바이트코드로 바꾼 후 inputStream으로 생성
Byte[] crtByte = Base64.decode(crtStr);
ByteArrayInputStream in = new ByteArrayInputStream(crtByte);

3. generateCertificate(파일)

  • 입력 스트림(inStream) 로 읽힌 데이터로 증명서를 생성
  • 여러 인증서로 구성된 컬렉션을 분석하려는 경우에는 generateCertificates를 사용
Certificate certificate = cf.generateCertificate(in);



InputStream을 사용한 후에는 닫아주어야 함

close 하지 않으면 file handle 개수가 max 값을 초과하여서 문제가 발생
(file handle leak)

in.close();







Public key & Private key 를 생성해보자

키를 추출할 땐 PKCS8(개인키), X509(공개키)로 KEY타입으로 변환 후
KeyPactory를 통해 RSA암호화 방식으로 변경함

keyFactory

  1. getInstance(문자열 알고리즘)

    • 할당된 KeyFactory 알고리즘을 적용하는 KeyFactory 유형의 객체를 반환
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  2. Public key 또는 Private Key spec 얻기

    • KeySpec 인스턴스를 생성할 땐 인수로 바이트코드를 주어야함
    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decode(keyString));
  3. generatePrivate(키 스펙)

    • 알고리즘이 적용된 KeyFactory 인스턴스로
      할당된 키 인스턴스를 이용해 PrivateKey 또는 PublicKey를 추출
    PrivateKey keyPrivate = keyFactory.generatePrivate(keySpec);

Public Key 생성

KeyFactory fac = KeyFactory.getInstance("RSA");
X509EncodedKeySpec x509Spec = new X509EncodedKeySpec(Base64.decode(keyString)); 
PublicKey publicKey = fac.generatePublic(x509Spec);

Private Key 생성

KeyFactory fac = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decode(keyString));
PrivateKey privateKey = fac.generatePrivate(keySpec);







난수를 이용한 키 얻기

KeyPairGenerator

  1. getInstance(암호화 알고리즘)
    • 할당받은 알고리즘으로 인스턴스 생성
    KeyPairGenerator keyPair = KeyPairGenerator.getInstance("RSA");
  2. initialize(keySize, SecureRandom)
    • 지정된 파라미터 세트와 난수의 발생원을 사용해 키 생성
    keyPairGenerator.initialize(2048, new SecureRandom());
  3. generateKeyPair
    • 키페어 생성
    keyPairGenerator.generateKeyPair();

보안에 민감한 응용 프로그램에서 사용할 암호학적으로 안전한 의사 난수 생성기를 얻으려면 SecureRandom을 사용하는 것이 좋음







X509V3 인증서 생성하기


X509V3CertificateGenerator 를 이용하며,

[학습] Spring Security 관련 정리 - (3) 인증서

위 링크를 참고하여 인증서 표준 규격에 맞게 세팅



응용 코드 참고 사이트






서명/검증 방법

서명: 개인키를 통해 데이터에 서명
검증: 공개키를 통해 원장정보 검증

Signature

1. getInstance(알고리즘)

  • 지정된 알고리즘 방식을 통해 Signature 인스턴스 생성
    Sign sign = Signature.getInstance("SHA256WithRSA");

2-1. initVerify(공개키)

  • 검증용으로 객체를 초기화
    sign.initVerify(publicKey);

2-2. initSign(개인키)

  • 서명용으로 객체를 초기화
    sign.initSign(privateKey);

3. update(byte[])

  • 지정된 바이트 배열을 사용해, 서명 또는 검증의 대상 데이터를 갱신
    // 검증 시
    sign.update(원장정보 바이트코드);
    // 서명 시
    sign.update(데이터 바이트코드);

4-1. verify(byte[])

  • 건내받은 서명을 검증
    sign.verify(Base64.decode(시그니처키))

4-2. sign()

  • 갱신된 모든 데이터의 서명 바이트를 리턴
    byte[] bytes = sign.sign();



Signature 정의 사이트






💡 TIPS!


1. Base64란

  • 바이너리 데이타를 아스키 문자열로 표현하는 인코딩 방식
  • 영문 대문자(A ~ Z) 26개, 영문 소문자 (a ~ z) 26개, 그리고 숫자 (0 ~ 9) 10개 등 62개의 값들을 기본적으로 가지며,
    마지막에 + 와 / 두개를 합쳐 총 64개의 인코딩 문자를 가짐
  • toBase64String를 이용해 바이트코드를 Base64로 변환할 수 있음
// str을 getEncoded를 이용해 바이트 코드로 만든 후
// toBase64String를 이용해 Base64 형으로 변환
Base64.toBase64String(str.getEncoded());

2. Files.readAllBytes( Path )

  • path 경로의 파일을 바이트 코드로 읽어옴
  • 문자열 형식으로 반환을 원할 경우 String 생성자를 이용
byte[] keyBytes = Files.readAllBytes(Paths.get(파일경로));
String keyString = new String(keyBytes);

3. KeyFair와 KeyFactory의 차이

KeyFair

  • 비대칭키 한쌍(공개키, 개인키)을 캡슐화
  • 주로 KeyFatory를 이용해 각각의 키를 만든 후 KeyFair을 통해 묶음

KeyFactory

  • 지정된 알고리즘을 구현하여 Key Spec으로부터 공개/개인키를 생성
profile
tistory로 이전! https://sweet-rain-kim.tistory.com/

0개의 댓글