Java(java.security)中的签名是否存在大小限制?

时间:2010-04-20 19:47:48

标签: java security digital-signature sha1

我正在尝试使用SHA1签署令牌对象。 我使用bouncycastle作为安全提供者。 每当程序尝试签名时,它都会给我这个错误。

java.security.SignatureException: java.lang.IllegalArgumentException: input data too large.

签名的最大尺寸是多少? 您对如何签署此对象有任何建议吗?

2 个答案:

答案 0 :(得分:5)

输入大小仅限于键的大小。如果使用1024位密钥,则限制为128个字节。

通常,您要对摘要(哈希值)进行签名,而不是实际数据。

答案 1 :(得分:1)

要修复该错误,只需使用更大的密钥大小即可。例如,如果选择SHA 512位,则密钥可以是1024位。但是你会失败的是相同(512)或更短的密钥。

BouncyCastle只是给我们一个无法使用的错误消息。但是std lib可以正常工作。比较他们:

// using a 512 bit key here
// leads to this error message if Sun's standard provider is used
Signature sig = Signature.getInstance("SHA512withRSA", "SunRsaSign");
rsa.initSign(privateKey);
rsa.update(data);
rsa.sign();

java.security.InvalidKeyException: Key is too short for this signature algorithm
    at sun.security.rsa.RSASignature.initCommon(RSASignature.java:129)
    at sun.security.rsa.RSASignature.engineInitSign(RSASignature.java:111)
    at sun.security.rsa.RSASignature.engineInitSign(RSASignature.java:101)
    at java.security.Signature$Delegate.engineInitSign(Signature.java:1127)
    at java.security.Signature.initSign(Signature.java:511)


// using a 512 bit key here
// leads to this error message if the BounceCastle provider is used
Signature sig = Signature.getInstance("SHA512withRSA", "BC");
    ...

java.security.SignatureException: java.lang.IllegalArgumentException: input data too large
    at org.bouncycastle.jce.provider.JDKDigestSignature.engineSign(Unknown Source)
    at java.security.Signature$Delegate.engineSign(Signature.java:1160)
    at java.security.Signature.sign(Signature.java:553)