CertificateFactory
지정된 타입의 CertificateFactory 객체를 작성해, 지정된 프로바이더를 구현 (SPI 객체)
// 공개키 유형의 X.509를 이용
CertificateFactory cf = CertificateFactory.getInstance("X.509");
FileInputStream in = new FileInputStream(파일경로);
Byte[] crtByte = Base64.decode(crtStr);
ByteArrayInputStream in = new ByteArrayInputStream(crtByte);
Certificate certificate = cf.generateCertificate(in);
close 하지 않으면 file handle 개수가 max 값을 초과하여서 문제가 발생
(file handle leak)
in.close();
키를 추출할 땐 PKCS8(개인키), X509(공개키)로 KEY타입으로 변환 후
KeyPactory를 통해 RSA암호화 방식으로 변경함
getInstance(문자열 알고리즘)
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Public key 또는 Private Key spec 얻기
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decode(keyString));
generatePrivate(키 스펙)
PrivateKey keyPrivate = keyFactory.generatePrivate(keySpec);
KeyFactory fac = KeyFactory.getInstance("RSA");
X509EncodedKeySpec x509Spec = new X509EncodedKeySpec(Base64.decode(keyString));
PublicKey publicKey = fac.generatePublic(x509Spec);
KeyFactory fac = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decode(keyString));
PrivateKey privateKey = fac.generatePrivate(keySpec);
KeyPairGenerator keyPair = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048, new SecureRandom());
keyPairGenerator.generateKeyPair();
보안에 민감한 응용 프로그램에서 사용할 암호학적으로 안전한 의사 난수 생성기를 얻으려면 SecureRandom을 사용하는 것이 좋음
X509V3CertificateGenerator 를 이용하며,
[학습] Spring Security 관련 정리 - (3) 인증서
위 링크를 참고하여 인증서 표준 규격에 맞게 세팅
서명: 개인키를 통해 데이터에 서명
검증: 공개키를 통해 원장정보 검증
Sign sign = Signature.getInstance("SHA256WithRSA");
sign.initVerify(publicKey);
sign.initSign(privateKey);
// 검증 시
sign.update(원장정보 바이트코드);
// 서명 시
sign.update(데이터 바이트코드);
sign.verify(Base64.decode(시그니처키))
byte[] bytes = sign.sign();
// str을 getEncoded를 이용해 바이트 코드로 만든 후
// toBase64String를 이용해 Base64 형으로 변환
Base64.toBase64String(str.getEncoded());
byte[] keyBytes = Files.readAllBytes(Paths.get(파일경로));
String keyString = new String(keyBytes);