据我了解,数字签名是通过使用您自己的私钥加密(邮件摘要),然后是收件人的公钥来获得的。
在Java中,我无法弄清楚如何使用公钥来执行第二阶段的签名。
Signature sig = Signature.getInstance("MD5WithRSA");
sig.initSign(privateKey);
sig.update(data);
byte[] signatureBytes = sig.sign();
我检查了API,使用公钥的唯一方法是验证...
答案 0 :(得分:6)
邮件签名中没有收件人参与。如果您想阻止其他人验证签名,您可以将签名加密到收件人的公钥,但这通常不被视为签署邮件的一部分。
答案 1 :(得分:3)
在公钥加密中:
私钥用于签名和解密/解密。
公钥用于验证签名和加密/加密。
请参阅the glossary of the TLS specification:
公钥加密:一种采用双密钥密码的加密技术。使用公钥加密的消息可以 仅使用关联的私钥解密。反过来, 使用私钥签名的邮件可以与公众一起验证 键。
虽然使用RSA,用于签名的数学运算与用于加密的数学运算非常相似(在签名中与“加密”摘要大致相同),但并非所有算法(例如DSA)的情况都是如此。 。此外,混合使用术语会导致整体安全性推理出现问题。
你在这里所做的只是签约的唯一阶段。除此之外,您可能还希望对消息进行加密(使用收件人的公钥),但这是一个独立的操作。您可能需要查看Cipher
来执行此操作。当然,这不仅仅是您之前想要加密的签名,而是初始消息及其签名的串联。 (我不确定加密签名是否有任何意义。)
答案 2 :(得分:2)
没有使用收件人公钥加密数字签名的步骤;在这种情况下,它不会是(通用)数字签名,因为只有收件人才能解密(并因此检查)它。
所以,是的(不知道Java的具体内容),我并不感到惊讶,API只提供创建需要私有RSA密钥的功能,而收件人需要您的公共RSA密钥来检查您的签名,这是你提到的API的第二部分。
答案 3 :(得分:0)
“第二阶段”是什么意思,用私钥加密哈希,或验证签名?
在调用update()
后,粘贴的代码已经为您提供了签名。签名对象已经执行了哈希(MD5)并使用私钥(RSA)进行加密。
要验证签名,您只需遵循here
所述的对称步骤