JAVA 和 OpenSSL CLI 中的签名不同

Signature differs in JAVA and OpenSSL CLI

我有一个架构,我想在一台服务器上使用私钥签署一些数据,并在另一台服务器上使用相应的 public 密钥验证签名。我有 java 代码在我的第一台服务器上签署数据,而在第二台服务器上验证相同数据正在使用 OpenSSL shell。我无法以某种方式实现这一点,我在第二台服务器上的验证失败。 为了进行调试,我决定使用与第一台服务器相同的私钥在第二台服务器上对数据进行签名,并比较这两个签名。似乎两个服务器生成不同的签名。

正在第一台服务器上生成签名 -

`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==

不需要 Java 代码中的 sha1 摘要。 SHA1withRSA 签名算法会做,所以你要散列两次

移除

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

并直接使用sign.update(messageBytes);

如果遇到问题,另请参阅此内容Why are the RSA-SHA256 signatures I generate with OpenSSL and Java different?


SHA-1 不再被认为是安全的。你不应该使用它