【发布时间】:2018-02-23 19:27:15
【问题描述】:
我在签署 rsa 签名时遇到问题。我有一个已用私钥加密的签名。但是,在尝试使用公钥验证它时我遇到了问题。我得到以下异常:
java.security.SignatureException: Signature length not correct: got 336 but was expecting 128
at sun.security.rsa.RSASignature.engineVerify(RSASignature.java:189)
at java.security.Signature$Delegate.engineVerify(Signature.java:1219)
at java.security.Signature.verify(Signature.java:652)
at XmlReader.main(XmlReader.java:65)
我已通过以下方式检索了我的签名和公钥:
BigInteger modulus = new BigInteger(Base64.getDecoder().decode(publicKeyString));
BigInteger exponent = new BigInteger(Base64.getDecoder().decode("AQAB"));
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, exponent);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(keySpec);
byte[] sigToVerify = Base64.getDecoder().decode(signatureString);
Signature sig = Signature.getInstance("MD5WithRSA");
sig.initVerify(pubKey);
boolean verifies = sig.verify(sigToVerify);
应用程序在最后一行失败。关于此异常的原因有什么想法吗?
更新:
添加要验证的签名数据:
String data = "...." //hidden since sensitive data
byte[] dataBytes = Base64.getEncoder().encode(data.getBytes());
dataBytes = Base64.getDecoder().decode(dataBytes);
【问题讨论】:
-
签名的内容在哪里?
-
MD5 对于签名生成显然是不安全的。根据输入,它仍然可能具有 some 值,但我不会打赌。 1024 位 RSA 密钥现在也太小了。
标签: java security encryption rsa digital-signature