1

我在验证刚刚创建的签名时遇到问题。签名后,我首先使用 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)。

4

1 回答 1

0

你为什么首先使用SignedObject?它给你买了什么?至于验证失败,请确保在传输/接收后获得相同的字节。您是否以相同的编码发送/接收?有人修改字符串吗?

于 2012-07-25T02:53:17.427 回答