我在验证我刚刚创建的签名时遇到了问题。签名后我首先使用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)。
答案 0 :(得分:0)
为什么你首先使用SignedObject
?它给你带来了什么?至于验证失败,请确保在发送/接收后获得相同的字节。您是否使用相同的编码发送/接收?有人在修改字符串吗?