我发现了2个类似的问题,并尝试运行代码作为解决方案,因为那些答案对我来说没有用,所以用代码片段提出问题。
两个人都说答案不起作用所以请不要把这个问题视为DUPLICATE
这是我的代码。
import com.sun.org.apache.xml.internal.security.utils.Base64;
import java.io.FileInputStream;
import java.security.PublicKey;
import java.security.Signature;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import xmlread.ReadXMLFile;
public class CertificateTest {
public static void main(String[] sdd) {
try{
FileInputStream fin = new FileInputStream("pub.arm");
CertificateFactory f = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate) f.generateCertificate(fin);
PublicKey pk = certificate.getPublicKey();
byte[] sign = "Qn/rlJRdZAdlPpu1UmmjE+rup8rv8d6XlS9MngAorzYDXefw0vWEP4eHil3YHoA1JUkoQQOgmw0w0QZFmrQbS33sa2t76iuqXI7EtnAPU798K+hEXP88tsYDWJNJFo9DdhkGltP5dQ02DN030Q1w58aTF+yZFfY1KVOPx2bIoL8=".getBytes();
Signature sig = Signature.getInstance("SHA1withRSA");
sig.initVerify(pk);
sig.update(Base64.decode(ReadXMLFile.getString().getBytes()));
boolean verifies = sig.verify(Base64.decode(ReadXMLFile.getString().getBytes()));
System.out.println("signature verifies: " + verifies);
}catch(Exception ex){}
}
}
答案 0 :(得分:1)
在我知道ReadXMLFile.getString
不是正在测试完整性的数据而是编码签名本身之前,解释如下。有关决议,请参阅our discussion。
您的代码错误 - 您正在尝试将base64解码的ReadXMLFile.getString()
的RSA加密SHA1摘要与自身进行比较。
final byte[] data = Base64.decode(ReadXMLFile.getString().getBytes());
sig.update(data);
boolean verifies = sig.verify(data);
来自specification for Signature.update
:
使用指定的字节数组更新要签名或验证的数据。
然后,从Signature.verify
:
验证传入的签名。
现在,您实际上并未将签名数据传递到verify
!您的意思是sig.verify(Base64.decode(sign))
代替吗?
如果您需要进一步的证明,请发布pub.arm
,我可以展示正常的代码: - )