我在验证刚刚创建的签名时遇到问题。签名后,我首先使用 Base64 将签名转换为文本,作为测试,我想验证我是否可以解码 Base64 并验证签名。这失败了。这是一些没有错误处理的代码。
我有我的密钥对:
DSAPrivateKey privateKey = (DSAPrivateKey) keyPair.getPrivate();
DSAPublicKey publicKey = (DSAPublicKey) keyPair.getPublic();
现在我签署一些文本并打印到日志输出 - 看起来很好:
String text = "test";
Signature signer = null;
signer = Signature.getInstance(privateKey.getAlgorithm());
SignedObject signedObject = null;
signedObject = new SignedObject(text, privateKey, signer);
String print_signature = Base64.encodeToString(signedObject.getSignature(), Base64.DEFAULT);
System.out.println("Base64 Signature: " + print_signature);
现在我使用上面创建的 SignedObject 对象而不是 Base64 来验证签名。这是成功的:
Signature verifier = null;
verifier = Signature.getInstance(publicKey.getAlgorithm());
boolean b = signedObject.verify(publicKey, verifier));
对于我的应用程序,我将只有签名者的公共证书和 Base64 编码字符串,因此我必须仅使用这些参数验证签名,因此 AFAIK 不能使用 SignedObject 对象。我使用了 Signature 对象:
Signature verifier1 = null;
verifier1 = Signature.getInstance(publicKey.getAlgorithm());
verifier1.initVerify(publicKey);
verifier1.update(text.getBytes()); // sorry I forgot this in original posting
byte[] sig1 = Base64.decode(print_signature, Base64.DEFAULT);
b = verifier1.verify(sig1));
此验证总是失败(b = false)。