2017-11-22 6 views
2

한 서버의 일부 데이터에 개인 키로 서명하고 해당 공용 키가있는 다른 서버의 서명을 확인하려는 아키텍처가 있습니다. 내 첫 번째 서버에서 데이터에 서명하고 두 번째 서버에서 동일한 데이터를 확인하는 Java 코드가 OpenSSL 셸을 사용하고 있습니다. 아무 래도 이것을 구현할 수 없으며 두 번째 서버에서 확인이 실패합니다. 디버깅하려면 첫 번째 서버에서 사용한 것과 동일한 개인 키를 사용하여 두 번째 서버에서 데이터에 서명하고 두 가지 서명을 모두 비교하기로 결정했습니다. 두 서버가 서로 다른 서명을 생성하는 것 같습니다.JAVA 및 OpenSSL CLI의 서명이 다릅니다

`String My_Message = "This is Sample Text"; 

//Get Key from file tkt_privkey_rsa.pem 
PrivateKey priv = loadPrivateKey(); 

// Compute digest 
MessageDigest sha1 = MessageDigest.getInstance("SHA1"); 
byte[] digest = sha1.digest(My_Message.getBytes()); 

//Prepare signature. 
Signature sign = Signature.getInstance("SHA1withRSA"); 
sign.initSign(priv);    
sign.update(digest); 

//Sign the data with private key. 
byte[] realSig = sign.sign(); 

//encode Signature 
String encodedSig = Base64.getEncoder().encodeToString(realSig); 

System.out.println("Signature Generated -\n"+encodedSig); 

return encodedSig; 

출력 - - Signature Generated - Aap+/3SvcXs/pCsSnih+MDjoMU9GdWSkPsQ8DSELpxKUhHNwKneKi8NkIzy0Hrw9GGvGfeWUTzZhg1XWYcOso4oRqN6kWyX5BLAbdDV+uncmv0kFqp5PlRobNpjPgqdvjp6vrME7HGN4yLW0eIN1alOBYRFPzS/J4O7Ds0LzRILCmToo4dhGy/DI109CdVSdNQdzuGJ4bZoTGnRiXKmupUf3arJAq+zRCtIFd/k4LCVr9tZQIjOgkpjOForjbsgkXnFrq8WAop6f9qk3cb9tJuExzqdi5LhjplO5xm8VjxqEkwB/HI+3aiF0xzgzMf6DrUyCUQx20ewWaaOubBonvg==

두 번째 서버 사용은 OpenSSL -

echo "This is Sample Text"| openssl dgst -sha1 -sign tkt_privkey_rsa.pem | openssl enc -base64 -A

출력 - nyGcKeXHTK85/MuydT9Y/cd/rbR1ojAQmfFiVvDvEs46qOhIFAv8H4kbaQO63TUyXFlKV1nTiHaPrBnBfW2iKZXSDrcThO3R5znYwvA1RamxmHz5OVRQjGzBdStO43pRML4xGpa9keBj4RCEFM1NlDot4IUrVenyerQhEnymTaaVamIVmVyxYpm2/9b85umqXo/BsATKP174Amqd52X+ED1Cr/CbXVmErvOmxjMdPm9iEYgnWnRc74z6MQzt62gcP3uHuaFlR3U0dRNq51Vr1Z9vZ44NILSRqMZMIU//XZ7bwnnoraj3LeJ9pPzTNdN2Wv3BOYyFXxBi08O/Q517GA==

첫 번째 서버에

생성 서명

+0

'echo -n "을 시도하십시오. 이것은"샘플 텍스트 "입니다. Echo는 기본적으로 끝에 새 줄을 추가합니다. 'echo -n'은 새로운 라인을 추가하지 않습니다. –

답변

1

자바 코드에서 sha1 다이제스트가 필요하지 않습니다. 직접 sign.update(messageBytes);

참조는 또한 문제 Why are the RSA-SHA256 signatures I generate with OpenSSL and Java different?


SHA-1이이 경우 SHA1withRSA 서명 알고리즘은 그것을 할 것입니다, 그래서 당신은

MessageDigest sha1 = MessageDigest.getInstance("SHA1"); 
byte[] digest = sha1.digest(My_Message.getBytes()); 

를 제거하고 사용을 두 번

해싱된다 더 이상 안전한 것으로 간주되지 않습니다.

+0

플러스 유닉스'echo "stuff"는'stuff'를 출력합니다 PLUS NEWLINE은'stuff'와는 다르며 다른 서명을 가지고 있습니다. 여러분의 OS 및/또는 셸에 따라'-n' 또는'\ c'를 사용하면 _may_하지만이를 피할 수는 있지만'printf '% s' "stuff"'는 더 이식 가능하고 신뢰할 수 있습니다. Windows가 더 나쁩니다. 'echo "stuff"는 쿼트 마크와 CRLF를 포함하는 "stuff"를 출력하며, 가장 가까운 수정은'set/p'를 사용한 해킹입니다. ASCII가 아닌 텍스트의 경우 다른 인코딩의 위험이 있습니다. 입력을 정확히 제어 할 수있는 파일을 사용하는 것이 좋습니다. –

+0

나는 다이제스트가 없어도 여전히 차이가 있습니다 ... –

+0

@ dave_thomson_085에 의해 주석 처리 된'echo' 문제를 확인하십시오. 'openssl dgst -sha1 -sign tkt_privkey_rsa.pem pedrofb