Hashed Data RSA 서명할 때 주의사항
결론 : RSA Hasehd Data RSA 서명할 때 OAEP 패딩을 쓰면 안됨. 아니, 쓰지 못함.
상황
- RSA(SHA256WithRSA) 서명 해야할 상황
- 평문은 전송 안함
- RSA 서명(개인키 암호화) 전 값을 만들어줘야 함
RSA 서명의 구조
- RSA 서명은 평문에 대해 해쉬한 후, 개인키를 이용하여 암호화
- 근데 평문해쉬를 바로 암호화 하는것은 아님
- 평문 해쉬 + OID 등 다른 정보를 연접한 후 암호화(ASN.1 구조).
문제
- PKCS1Padding은 문제 없음
- OAEPPadding은 JCE에서 문제가 생김
- java.security.InvalidKeyException: oaep cannot be used to sign or verify signatures
선결론: RSA 서명에 사용하는 Padding 방식은 PKCS1-v1.5 또는 PSS를 사용해야함
1. OAEP 패딩은 Signature 생성할 때 왜 사용 못함?
- 애초에 PKCS1 v2.0 표준 자체에서 OAEP 패딩은 메시지의 암/복호화를 위한 표준이다. OAEP-Padding은 다음의 말을 줄인거임
- RSAES-OAEP(RSA Encryption Schems) 즉, 암호화를 위한 패딩이고, 서명용으로 사용하는것은 적합하지 못함.
2. RSA Signature PKCS1 v1.5 패딩은 안전한가?
- 일단 이 질문이 나온것은 RSAES-PKCS1-v1_5 패딩방식이 오라클 패딩 공격에 취약하기 때문임
- RSAES는 취약하지만, RSASSA는 아직까지는 안전하댄다.
- 레퍼런스
3. Java Signature의 Padding 방식은 선택을 못하는가??
- 일반 JCE는 선택을 못함, Bouncy Castle을 사용해야 함.
- Signature.class를 열어보면 Cipher의 Transformation이 RSA/ECB/PKCS1Padding 픽스 되어 있는 것을 확인할 수 있닼ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
4. PKCS1 패딩 종류가 궁금해짐
- RSAES-OAEP (v2.0에 나옴)
- RSAES-PKCS1-v1_5 (padding oracle attack 취약)
- RSASSA-PSS (v2.1에 나옴, RSASSA-PKCS1-v1_5 보다 안전한 방식이다.)
- RSASSA-PKCS1-v1_5 (아직까지는 괜찮음)
줄임말
- RSAES: RSA Encryption Schemes
- RSASSA: RSA Signature Schemes with Appendix
5. JCE에서의 PKCS1 지원 패딩이 궁금함
5-1. OAEP 패딩은 Java 7
https://docs.oracle.com/javase/7/docs/technotes/guides/security/SunProviders.html
5-2. RSASSA-PSS Signature는 Java 11부터 사용 가능하다(참...; 늦게도 지원한다.).
https://bugs.openjdk.java.net/browse/JDK-8146293
6. Hashed Data RSA 서명 샘플 파일
- 해당 샘플 JCE와 크로스 검증 완료한거
- https://github.com/ehdvudee/study/blob/master/src/jce/Sample024HashedDataSign.java
결론: SHA3 켸촥도 Java9부터 지원하니 원... Bouncy Castle을 사용하자.
'개발관련 > (과거)메모' 카테고리의 다른 글
Docker PostgreSQL 볼륨 매핑 권한 문제 without root (0) | 2020.03.18 |
---|---|
JUnit과 함께하는 AssertJ (0) | 2019.11.12 |
스프링 빈과 Thread-Safe (0) | 2019.10.01 |
mybatis- "IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String (2) | 2019.06.28 |
Integer.ParseInt() vs Integer.valueof() (1) | 2017.05.08 |