我有一个架构,我想在一台服务器上使用私钥签署一些数据,并使用相应的公钥验证另一台服务器上的签名。我有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==
答案 0 :(得分:1)
不需要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不再被视为安全。你不应该使用它