Есть ли ограничение размера подписей в Java (java.security)? - PullRequest
4 голосов
/ 20 апреля 2010

Я пытаюсь подписать маркерный объект, используя SHA1. Я использую Bouncycastle в качестве поставщика безопасности. Всякий раз, когда программа пытается что-то подписать, она выдает мне эту ошибку.

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

Какой максимальный размер для подписи? Есть ли у вас какие-либо предложения о том, как я могу подписать этот объект?

Ответы [ 2 ]

5 голосов
/ 20 апреля 2010

Размер ввода ограничен размером ключа. Если вы используете 1024-битный ключ, вы ограничены 128 байтами.

Как правило, вы подписываете дайджест (хэш-значение), а не фактические данные.

1 голос
/ 17 ноября 2013

Чтобы исправить эту ошибку, нужно просто использовать больший размер ключа. Например, если выбран SHA 512 бит, ключ может быть 1024 бит. Но вы потерпите неудачу с ключом такой же (512) или меньшей длины.

BouncyCastle просто выдает нам сообщение об ошибке. Но стандартная библиотека выполняет свою работу правильно. Сравните их:

// 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)
...