Проверка подписи без подписанных атрибутов с помощью Bouncy Castle 1.70JAVA

Программисты JAVA общаются здесь
Ответить
Гость
 Проверка подписи без подписанных атрибутов с помощью Bouncy Castle 1.70

Сообщение Гость »


Я начал работать над проектом, в котором мы используем Bouncy Castle для проверки цифровых подписей, и наткнулся на ошибку. Это метод проверки: `

private SetverifySignature(PDSignature sig, X509Certificate SignerCertificate, SignerInformation SignerInfo, List цепочка, SignatureInfo SignatureInfo) выдает OperationCreationException { Set пустойTrustedBy = новый HashSet(TLName.values().length); // проверка действительности сертификата во время подписания пытаться { SignerCertificate.checkValidity(sig.getSignDate().getTime()); } catch (CertificateExpiredException e) { LOG.info("Проверка подписи не удалась, срок действия сертификата истек."); вернуть пустойTrustedBy; } catch (CertificateNotYetValidException e) { LOG.info("Проверка подписи не удалась, сертификат еще не действителен."); вернуть пустойTrustedBy; } //проверяем все сертификаты из цепочки в списках доверия Set fillTrustedBy = TrustedCertificates.getTrustedByForChain(chain.toArray(new X509Certificate[0])); если (filledTrustedBy.isEmpty()) { LOG.info("Проверка подписи не удалась, сертификат не найден среди наших доверенных сертификатов."); вернуть пустойTrustedBy; } // проверка подписи с помощью открытого ключа Верификатор SignerInformationVerifier = новый JcaSimpleSignerInfoVerifierBuilder().build(signerCertificate); пытаться { если (signerInfo.verify(verifier)) { SignatureInfo.signedBytesUnchanged = правда; подписьInfo.checksum = DatatypeConverter.printHexBinary(signerInfo.getContentDigest()); LOG.debug("Проверка подписи завершена, подпись проверена."); вернуть заполненноеTrustedBy; // только здесь возвращаем массивtrustBy, заполненный значениями } подписьInfo.checksum = DatatypeConverter.printHexBinary(signerInfo.getContentDigest()); } catch (CMSException e) { LOG.info("Проверка подписи не удалась, не удалось проверить подпись. Сообщение об исключении: " + e.getMessage()); } вернуть пустойTrustedBy; } Из того, что я исследовал об использовании этой библиотеки, утверждение if (signerInfo.verify(verifier)) { ...} должно быть законным способом ее использования. Но у нас был дополнительный уровень, на котором мы сами вычисляли контрольную сумму для проверки в разных компонентах нашего проекта:

Private void checkSignedBytes(SignerInformation SignerInfo, File inFile, int[] byteRange, SignatureInfo SignatureInfo) выдает NoSuchAlgorithmException, IOException { Атрибут атрибута = SignerInfo.getSignedAttributes().get(CMSAttributes.messageDigest); DEROctetString sigDigest = (DEROctetString) атрибут.getAttrValues().getObjectAt(0); byte[] sigDigestBytes = sigDigest.getOctets(); byte[] contentDigestBytes = Signer.getDigest(inFile, byteRange, SignerInfo.getDigestAlgOID()); SignatureInfo.checksum = DatatypeConverter.printHexBinary(sigDigestBytes); SignatureInfo.signedBytesUnchanged = Arrays.equals(sigDigestBytes, contentDigestBytes); } Раньше это работало, пока мы не наткнулись на случай, когда мы столкнулись с цифровой подписью без подписанных атрибутов. Я пытался изучить библиотеку, но из-за какой-то проблемы не могу ее отладить. Насколько я могу судить, происходит в doVerify( ... ) в классе SignerInformation подписей Bouncy Castle без подписанных атрибутов.

Расчет дайджеста:

if (signedAttributeSet == null) { if (экземпляр contentVerifier RawContentVerifier) { content.write(digOut); } еще { OutputStream cOut = новый TeeOutputStream (digOut, sigOut); content.write(cOut); cOut.close(); } } Проверка:

if (signedAttributeSet == null && resultDigest != null) { if (экземпляр contentVerifier RawContentVerifier) { RawContentVerifier rawVerifier = (RawContentVerifier)contentVerifier; если (encName.equals("RSA")) { DigestInfo digInfo = новый DigestInfo (новый AlgorithmIdentifier (digestAlgorithm.getAlgorithm(), DERNull.INSTANCE), resultDigest); return rawVerifier.verify(digInfo.getEncoded(ASN1Encoding.DER), this.getSignature()); } return rawVerifier.verify(resultDigest, this.getSignature()); } } На мой вопрос - я переместил логику второго метода checkSignedBytes( ... ) в первый метод verifySignature( ... ) здесь: if (signerInfo.verify(verifier)) { SignatureInfo.signedBytesUnchanged = правда; подписьInfo.checksum = DatatypeConverter.printHexBinary(signerInfo.getContentDigest()); LOG.debug("Проверка подписи завершена, подпись проверена."); вернуть заполненноеTrustedBy; // только здесь возвращаем массивtrustBy, заполненный значениями } Должно ли это быть нормально? Потеряна ли какая-то информация из-за отсутствия подписанных атрибутов? Учитывая, что эти атрибуты необходимы в разных компонентах, у меня нет другого выбора, кроме как инициализировать их, несмотря на то, насколько это может показаться излишним. Спасибо за ваши ответы!

Подробно описано выше.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»