개발관련/(과거)메모

Hashed Data RSA 서명할 때 주의사항

동팡 2019. 10. 1. 20:17

결론 : 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는 아직까지는 안전하댄다. 

 - 레퍼런스

  https://crypto.stackexchange.com/questions/48407/should-i-be-using-pkcs1-v1-5-or-pss-for-rsa-signatures

 

Should I be using PKCS1 v1.5 or PSS for RSA signatures?

I am implementing an application where a user needs to sign some data that they have created, store it in an untrusted place, then later retrieve that data and verify it is still authentic before u...

crypto.stackexchange.com

https://stackoverflow.com/questions/43840827/how-to-sign-and-validate-rsa-pkcs1-v2-0-signatures-in-java

 

How to sign and validate RSA PKCS#1 v2.0 signatures in Java

I'm trying to sign and validate signature in RSA+SHA1 with PKCS1 v2.0 padding. I haven't found in the documentation (JDK or JCE) which algorithm/padding I have to use. It seems that I've to use OAEP

stackoverflow.com

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

 

Java Cryptography Architecture Oracle Providers Documentation

AES ECB, CBC, PCBC, CTR, CTS, CFB, CFB8..CFB128, OFB, OFB8..OFB128 NOPADDING, PKCS5PADDING, ISO10126PADDING RSA ECB NOPADDING, PKCS1PADDING, OAEPWITHMD5ANDMGF1PADDING, OAEPWITHSHA1ANDMGF1PADDING, OAEPWITHSHA-1ANDMGF1PADDING, OAEPWITHSHA-256ANDMGF1PADDING,

docs.oracle.com

5-2. RSASSA-PSS Signature는 Java 11부터 사용 가능하다(참...; 늦게도 지원한다.).
https://bugs.openjdk.java.net/browse/JDK-8146293

 

[JDK-8146293] Add support for RSASSA-PSS Signature algorithm - Java Bug System

 

bugs.openjdk.java.net

6. Hashed Data RSA 서명 샘플 파일

 - 해당 샘플 JCE와 크로스 검증 완료한거

 - https://github.com/ehdvudee/study/blob/master/src/jce/Sample024HashedDataSign.java

 

ehdvudee/study

test anything. Contribute to ehdvudee/study development by creating an account on GitHub.

github.com

 

결론: SHA3 켸촥도 Java9부터 지원하니 원... Bouncy Castle을 사용하자.