2017-11-22 8 views
2

私はあるサーバー上のデータに秘密鍵で署名し、それぞれの公開鍵で別のサーバー上の署名を検証するアーキテクチャを持っています。最初のサーバーでデータに署名するためのJavaコードがあり、2番目のサーバー上の同じデータの検証にはOpenSSLシェルが使用されています。どうにか私はこれを実装することができません、私の検証は2番目のサーバーで失敗します。 デバッグするには、最初のサーバーで使用したのと同じ秘密キーを使用して2番目のサーバーでデータに署名し、両方の署名を比較することにしました。両方のサーバーが異なる署名を生成するようです。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を使用して、第2のサーバ -

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 -n'は新しい行を追加しません。 –

答えて

1

Javaコードのsha1ダイジェストは必要ありません。あなたが二回

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

を削除し、問題Why are the RSA-SHA256 signatures I generate with OpenSSL and Java different?


SHA-1を持っている場合は、直接sign.update(messageBytes);

も参照してください。この使用ハッシングされるようにSHA1withRSA署名アルゴリズムは、それを行いますもはやセキュアであるとはみなされない。

+0

Plus Unix 'echo" stuff "は' stuff'を出力します。PLUS NEWLINEは 'stuff'とは異なりますが、別のシグネチャを持っています。あなたのOSやシェルに依存して、 '-n'や' \ c'を使ってこれを避けてください。しかし、 '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

関連する問題