Проверка подписи без подписанных атрибутов с помощью Bouncy Castle 1.70 ⇐ 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, заполненный значениями } Должно ли это быть нормально? Потеряна ли какая-то информация из-за отсутствия подписанных атрибутов? Учитывая, что эти атрибуты необходимы в разных компонентах, у меня нет другого выбора, кроме как инициализировать их, несмотря на то, насколько это может показаться излишним. Спасибо за ваши ответы!
Подробно описано выше.
Я начал работать над проектом, в котором мы используем 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, заполненный значениями } Должно ли это быть нормально? Потеряна ли какая-то информация из-за отсутствия подписанных атрибутов? Учитывая, что эти атрибуты необходимы в разных компонентах, у меня нет другого выбора, кроме как инициализировать их, несмотря на то, насколько это может показаться излишним. Спасибо за ваши ответы!
Подробно описано выше.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как реализовать MTL между клиентом и сервером в C# с помощью Bouncy Castle?
Anonymous » » в форуме C# - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Создание Public/Private Pare Pare с помощью Bouncy Castle или .NET RSACRYPTOServiceProvider
Anonymous » » в форуме C# - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Создание Public/Private Pare Pare с помощью Bouncy Castle или .NET RSACRYPTOServiceProvider
Anonymous » » в форуме C# - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-