Проверка подписи без подписанных атрибутов с помощью 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»