Почему я не могу использовать SHA1 до PKCS7.detached в iText7?

Как показано на рисунке, теперь я могу понять 1, и вот мой подписанный код успеха, который я использовал

pdfSigner.signExternalContainer(iExternalSignatureContainer, estimatedSize);

не

 pdfSigner.signDetached();

:

public class PdfSignatureContainerExt implements IExternalSignatureContainer {

private MySignUtil mySignUtil;
public PdfSignatureContainerExt(MySignUtil mySignUtil){
    this.mySignUtil= mySignUtil;
}

/**
 * 
 * @param data , the data to sign
 * @return a container with the signature and other objects, like CRL and OCSP. The container will generally be a PKCS7 one.
 * @throws GeneralSecurityException
 */
@Override
public byte[] sign(InputStream data) throws GeneralSecurityException {

    byte[] dataBytes = streamToBytes(data);
    return  mySignUtil.signP7DetachData(dataBytes);

}

@Override
public void modifySigningDictionary(PdfDictionary signDic) {
    signDic.put(PdfName.Filter, PdfName.Adobe_PPKLite);
    signDic.put(PdfName.SubFilter, PdfName.Adbe_pkcs7_detached);
}}

Чтобы реализовать 2, я изменил код, результат которого неверен:

public class PdfSignatureContainerExt implements IExternalSignatureContainer {

private MySignUtil mySignUtil;
public PdfSignatureContainerExt(MySignUtil mySignUtil){
    this.mySignUtil= mySignUtil;
}


@Override
public byte[] sign(InputStream data) throws GeneralSecurityException {

        byte[] dataBytes = streamToBytes(data);
        //change here
        BouncyCastleProvider provider = new BouncyCastleProvider();
        Security.addProvider(provider);

        MessageDigest messageDigest = MessageDigest.getInstance("SHA1" , "BC");
        byte[] hash = messageDigest.digest(dataBytes);

        return  mySignUtil.signP7DetachData(hash);      
}

@Override
public void modifySigningDictionary(PdfDictionary signDic) {
    signDic.put(PdfName.Filter, PdfName.Adobe_PPKLite);
    //change here
    signDic.put(PdfName.SubFilter, PdfName.Adbe_pkcs7_sha1);
}}

и результат вывода знака не удалось, вот мой неудачный PDF.

invalid.pdf

1 ответ

Решение

Метод, который вы используете для создания контейнера подписи CMS adbe.pkcs7.detached

return  mySignUtil.signP7DetachData(data);

InputStream data) создается для создания контейнера так же, как метод, который вы используете для создания контейнера CMS adbe.pkcs7.sha1

return  mySignUtil.signP7DetachData(hash);      

byte[] hash), по крайней мере, это то, что предлагает ваш пример файла.

Это неправильно: поскольку в PDF Reference 1.7 говорится:

  • adbe.pkcs7.detached: в поле подписанных данных PKCS#7 нет данных.
  • adbe.pkcs7.sha1: Дайджест SHA1 диапазона байтов инкапсулируется в поле подписанных данных PKCS#7 с ContentInfo типа Data.

(раздел 8.7.2 "Совместимость подписи")

Поскольку вы использовали эквивалентную функциональность для создания контейнеров CMS в обоих случаях, вы оставили поле подписанных данных PKCS#7 (с помощью которого eContent Строка октета в CMS SignedData поле EncapsulatedContentInfo в вашем контейнере adbe.pkcs7.sha1 пусто, что не соответствует спецификации.


PS: Обычно я бы сослался на стандарты ISO 32000, но, к сожалению, соответствующие разделы как в части 1, так и в части 2 были изменены таким образом, что делает содержание где-то между еще более неясным и совершенно неправильным. К сожалению, это не пришло мне в голову, когда можно было сделать ввод для ISO 32000-2.

PPS: Ceterum censeo adbe.pkcs7.sha1 больше не следует использовать. Наш код проверки явно не реализует проверку этих подписей.

Другие вопросы по тегам