2017-03-04 4 views
0

일부 데이터에 서명하려고하는 일부 코드 작업 중입니다. openssl이 생성 한 개인 키를 Java 키 저장소로 변환 한 후 SHA256withRSA와 함께 Java 서명 클래스를 사용하고 있습니다. 나는 openssl에서 Java 클래스로부터받은 서명을 확인하려고 노력하고있다. 그러나 어떤 이유로 나는 openssl을 검증 할 수 없다. 필자는 결국 iOS Swift 3에서이 서명 확인을 구현해야하지만 라이브러리를 발견하기 전에 openssl 표준에 대한 Java 서명을 확인하려고했습니다. 사용OpenSSL을 사용하여 Java 서명 클래스 서명 확인

HTTP/1.1 200 OK 
Connection: keep-alive 
X-Powered-By: Undertow/1 
TokenSignature: WtHSxFAy6yO2Bepb4NgRxYhRUEmKS793gd1NBX/bDErBjD3CTiLA8p05RNIG8U96bkwyi/ZySmQVwQf2w4meHMDBBpf7AnCSd1yZeBDeuWChiP3pGdUb3yuGIAnJdlKFHjaElDaJ3eqZD7JZcpcNeZv6xSQUZVi+xgZiUCtnZTYUZmkoRltkcEEbIv0rkERIsMhuuKAuLli7x76/XCpwNZ8dGc356Zzsq/gRhh8BrGejGKDJh/1D1iWAI6tfnBufs0EBe0E5kVm++3QVHNawETSjglBtUvre4ineSW9eTgzYfamijw2fvXOLVYf0p7iCdXJDFb9Pgm5ZDLGW4t/y6A== 
Server: WildFly/10 
Content-Type: application/json 
Content-Length: 343 
Date: Mon, 06 Mar 2017 23:28:57 GMT 

{"tokenId":8728935,"studentID":8580329,"username":"pkirkland","deviceName":"iPhone","expirationDate":1488842937819,"blacklisted":false,"employeeType":"student","groups":[{"id":9235,"name":"Software","ldapName":"cn=Software, cn=Groups, dc=example, dc=com"},{"id":9257,"name":"Students","ldapName":"cn=Students, cn=Groups, dc=example, dc=com"}]} 

자바 서명 클래스 :

예를 들어, I는 (서명 Signature.sign 주어진 바이트 배열()의베이스 64 부호화 된 버전으로 제공되는) 우리 로그인 서버에서이 응답을 얻을 개인 키.

-----BEGIN PUBLIC KEY----- 
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzX3f7gRMdClWmI1c03Ut 
u60JYJuHiSEnm8bfBhfa/UuGSY7dIGPE9tBt83lF9t2VvEz3GYsqWidrasUEbnf+ 
zAIYddk/6Z4Mdin6qNpYyh71dpDBBnvB2GB2atAhJlmS8BkaSt8nRBi9kFppTciJ 
TxpA7w+TucHV7YabSObyRUif+bRRYhNB2sY1I2zHB5fsg2SpBVYlYGnff5O7boKY 
o0QPW5WBtBL84xRJcvPBG8Azz4nPZuuW5gGCWY4kMj6fdT5n3yBAj0VeOxR9DO9e 
zG+BtTnJj9+F12lSZanIQlxjKjYRebuBsF9WKelLuW0iNTUVObMIyc+CmJs45rOg 
VQIDAQAB 
-----END PUBLIC KEY----- 

다음은 키 스토어의 개인 키입니다 (우리가 자극에없는) :

-----BEGIN RSA PRIVATE KEY----- 
MIIEowIBAAKCAQEAzX3f7gRMdClWmI1c03Utu60JYJuHiSEnm8bfBhfa/UuGSY7d 
IGPE9tBt83lF9t2VvEz3GYsqWidrasUEbnf+zAIYddk/6Z4Mdin6qNpYyh71dpDB 
BnvB2GB2atAhJlmS8BkaSt8nRBi9kFppTciJTxpA7w+TucHV7YabSObyRUif+bRR 
YhNB2sY1I2zHB5fsg2SpBVYlYGnff5O7boKYo0QPW5WBtBL84xRJcvPBG8Azz4nP 
ZuuW5gGCWY4kMj6fdT5n3yBAj0VeOxR9DO9ezG+BtTnJj9+F12lSZanIQlxjKjYR 
ebuBsF9WKelLuW0iNTUVObMIyc+CmJs45rOgVQIDAQABAoIBAAkeOL16+1l8LBeA 
zkmjvW/CcdQTkqQHEJbc8DB5BoKOw1qoOC+jva2l+fr/upcFpgtA7wX3It31OdL3 
AwdT076BqUwxY6CeHrdvjWvIpH/zd7jXG3mKLEPJo/eBXLcy6k41DvGbjUZ8Qo0R 
NfL5nv4fkBoLeuaXL0Lm4iUN+loQlocfIbc0LSd4xk84S8OcjflBkBt/YdV7YsO5 
4QMgDdFJ6nZVNcGRnwoiCsIS+cdDNjukvuqFMnSz12/IZ3/HXBycy3GGB4cgVRJS 
iKtTckH7hr5iT07XT/McuUVEXKotxTzqAEoPwG07hqx4WQeTFnXakKBOyx1LLZSx 
dt64IwECgYEA8VSi+kOu3mMusaVTkHpvzRBDLCWYvyub+hgaix4OUMxcglFfxBqq 
EISx33ri2uIuwcfDXNqte0O7Cz80E/hTWKUDFlQu8u+yNvgPFkNAlGoqNz0/9oqA 
2vDHjDhGTpTkGWJ//8CYpFJe6NO75ewoPpzUhLxz+S/HeITD7LV4+lECgYEA2fuL 
zv16MHBhIOVlXPEiWWRhztPP8e02z0xNdZiMJIIQa5DA0y/TNrCwKBwu1/FLPU+z 
NP1EXEJLB9y+IdEVisb/GVmDspVgE6ksk7JukCgDBrDts+6aSMt1Xy3y+aFIcxhq 
m2a70rdyhrDC6/iSLc/sfqE3A0T3PHGXmaUrAMUCgYA4c1XUOLTU7Fplz4hmiV1R 
mHY+A2Vhgm/v5md/Fz6+A6+4BBTkqGATkRaScgpSrQnG5lV6iOR/qu47yUMDUNke 
KSs5s+NvjEYhuZC94mlezh6l4TvvDaLqk9v5nshDZWydy36pcoHCHkp5J94SAFXB 
n6nOis6OAXElbdjuq9xqoQKBgQC+Btf+fmKCz7UcpF4VA/FZ1HSfhW8GDDF3zaDJ 
H08slGYUH4C5mjuatbUbglYj0ioxLMWhMBjkBLa8B+eIO2l4Lbo9MxfoGuhCu3ws 
1aQk73yT3LGb5imBxDxx2PC0RbGPBH4LMygRrfKdEIMcivmEDnqweYIny3tsqenq 
+13dsQKBgE+OkJgU8cJgvVhI8QmFwJekfbB9HFOX7xZrcGdTA3/TaEPiuxiUvLaS 
jEOIi5nDW4ZfEPeggFQcaKdbTvbCRjfkJFye6ftm8soNhayuy35atZX7u9RYjvJ8 
PZptOTd/xFTWxpux4xfu6BrBRsJF73DLkOo2JLgcQTYVZEs0cFR6 
-----END RSA PRIVATE KEY----- 

같은 공공는

다음 키 스토어의 공개 키입니다 키를 엽니 다. PKCS # 1과 PKCS # 8이기 때문에 개인 키가 다르게 보입니다.하지만 PKCS # 8은 다른 저장소 형식이기 때문에 중요하지 않다고 생각합니다.

문제는 openssl을 사용하여 원래 .pub 양식의 공개 키를 사용하여 서명을 확인하는 경우 openssl이 "확인에 실패했습니다"라고 말합니다. 패딩이나 인코딩에 차이가 있습니까? 그렇다면 openssl을 사용하여 확인하려면 어떻게해야합니까?

내가 사용자 정보와 JSON 개체에 서명을 확인하려고

편집. 코드는 기본 Java 서명 코드이지만 여기에있는 코드입니다.

byte[] unsigned = objString.getBytes("UTF-8"); 
Signature signer = Signature.getInstance("SHA256withRSA"); 
signer.initSign(cs.getPrivateKey()); 
signer.update(unsigned); //prepare for signature 
byte[] signature = signer.sign(); 

여기서 objString은 JSON 개체이고 cs는 데이터베이스에서 키에 액세스하는 데 사용되는 Crypto Singleton입니다.

편집 : 파트너가 데이터에 대해 이진 버전을 확인하고 있으며 이것이 실패한 것으로 확인되었습니다.

가있는 OpenSSL에서 확인하려면

, 나는 TXT 파일에 서명을 저장을 제외하고

base64 -d sig.txt> sig.bin 
openssl dgst -sha256 -verify pubkey.pub -signature sig.bin data.json 
+0

편집에 관련 정보가 추가되었습니다. – jkaw4

답변

1

에 전달 : 일반적으로 자바 Signature API 및 PKC 서명, 해시를 사용하지만, 서명을하지 생산 해시시. RSA 서명은 때로는 '암호화 된 해시'로 느슨하게 설명되지만 기술적으로는 잘못되어 다른 서명 방식에는 암호화 개념이 없습니다.

Signature.sign()에 의해 생성 된 실제 서명은 코드가 나타내는 바와 같이 이진이 들어있는 byte[]입니다. 게시 한 가치는 base64 인이며 이는 의 일반적인 방법이며 현대의 암호화 데이터 및 기타 이진 데이터를 나타냅니다. 해당 base64 을 다시 이진으로 변환하면 적어도 SHA256 해시에 유효한 PKCS1v1.5 'type 1'블록을 복구하는 것으로 확인됩니다.시도 :

openssl base64 -d -A <sig.txt >sig.bin # if version 1.1.0+ can omit -A 
openssl dgst -sha256 -verify pubkey.pub -signature sig.bin data.json 

또 다른 옆 : RSA 크기는 1024 비트에서, 실제로 지금까지 공개적으로 알려진 깨진되지는 않았지만 더 이상 (2014 년부터) 평가 허용 보안을 위해 충분한 마진을 제공하는 등 없습니다. 대부분의 기관은 현재 2048을 요구하며, 기술적으로는 적어도 1280 또는 1536을 사용해야합니다. 현재 예측할 수없는 양자 컴퓨팅의 진보는 없습니다. 그러나 그것은 보안 문제입니다 .X 또는 아마도 crypto.SX가 아닙니다.

+0

파트너와 다시 확인했으며 현재 Base64로 인코딩 된 버전이 아닌 이진 서명에 대한 확인을하고 있습니다. 또한 현재 2048 비트 RSA를 사용하고 있습니다. 그 밖의 모든 것을 시도한 결과 게시 한 명령을 시도했지만 불행히도 같은 결과가 나타납니다. 확인 실패 – jkaw4

+0

Q가 '현재가'가 아닙니까? Q의 키와 서명은 모두 1024 비트입니다. 내가 분명히 (?) 채워진 부분을 채우면 당신의 Q에 정확히 무엇을 할 수 있습니다. 서명과 일치하는 데이터를 추가 할 수 있습니까? 아니면 임의의 더미 데이터와 서명을 선호하는 경우 - ASCII 그래픽 (즉, CRLF 없음)이 없으면 b64 또는 16 진수를 사용하여 모든 바이트를 정확하게 보존 할 수 있습니까? –