2017-05-30 11 views
0

itextpdfライブラリを使用して外部署名付きの文書に署名できます。ハッシュと署名付きハッシュを使用してPDF文書に署名することは可能ですか?

しかし、エンドユーザは機密データを含む可能性があるため、文書を送信したくないという問題があります。そこで、私は、エンド・ユーザーに、外部サービスを使用してハッシュに署名するための文書ハッシュを与え、署名付きハッシュを戻すように依頼しました。

ただし、itextpdf(PdfSignatureAppearance)を使用して署名付きハッシュを使用して文書に署名しようとすると、PDF文書が署名されてしまうという問題が発生します。しかし、署名を検証すると、署名が無効であることが示されます。

ここでも同じような質問があります。 Sign PDF using an external service and iText

したがって、問題が発生するのは、PdfSignatureAppearance(itextpdfライブラリ)を使用してドキュメントを開くたびにハッシュが無効になるためです。

誰でも、以前に生成されたハッシュと署名されたハッシュ(これは私が外部サービスから入手したもの)を使用してPDF文書に署名することが可能かどうか教えてください。

+0

。 – StoneBird

+1

文書のバイトに署名するだけでは不十分です。特定の属性にも署名する必要があります。あなたの最終顧客は、iTextを使わずにハッシュを作成すべきではありません。 @ StoneBirdのコメントに加えて、完全なドキュメントをハッシュするだけではないということもあります。あなたは署名が置かれるPDFに「穴」を残す必要があります。 PDF内のすべてのバイトは、署名自体を除いて署名されていなければならないことは明らかです。* –

+0

@Harish cf. PDFシグネチャに関するいくつかの背景については、[Stack Overflow Documentation](https://stackoverflow.com/documentation/pdf/5161/integrated-pdf-signatures/18248/how-integrated-pdf-signatures-are-integrated#t=20170530094206122177) 。 – mkl

答えて

0
class MyExternalSignatureContainer implements ExternalSignatureContainer { 
    protected byte[] sig; 
    protected Certificate[] chain; 
    protected PrivateKey pk; 
    public MyExternalSignatureContainer(byte[] sig,Certificate[] chain,PrivateKey pk) { 
     this.sig = sig; 
     this.chain=chain; 
     this.pk=pk; 
    } 
    public byte[] sign(InputStream is)throws GeneralSecurityException { 

     return sig; 

    } 
    public void modifySigningDictionary(PdfDictionary signDic) { 
    } 
} 

public byte[] emptySignature_hash(String src, String dest, String fieldname, Certificate[] chain) throws IOException, DocumentException, GeneralSecurityException { 
     PdfReader reader = new PdfReader(src); 
     FileOutputStream os = new FileOutputStream(dest); 
     PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0'); 
     PdfSignatureAppearance appearance = stamper.getSignatureAppearance(); 
     appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, fieldname); 
     appearance.setCertificate(chain[0]); 
     ExternalSignatureContainer external = new ExternalBlankSignatureContainer(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED); 
     MakeSignature.signExternalContainer(appearance, external, 8192); 



     InputStream inp = appearance.getRangeStream(); 

     BouncyCastleDigest digest = new BouncyCastleDigest(); 


     byte[] hash = DigestAlgorithms.digest(inp, digest.getMessageDigest("SHA256")); 
     return hash; 


    } 


public byte[] signed_hash(byte[] hash, PrivateKey pk, Certificate[] chain)throws GeneralSecurityException{ 
     PrivateKeySignature signature = new PrivateKeySignature(pk, "SHA256", "SunPKCS11-eToken"); 

     //return extSignature; 
     BouncyCastleDigest digest = new BouncyCastleDigest(); 
     Calendar cal = Calendar.getInstance(); 
     String hashAlgorithm = signature.getHashAlgorithm(); 
     System.out.println(hashAlgorithm); 
     PdfPKCS7 sgn = new PdfPKCS7(null, chain, "SHA256", null, digest, false); 

     byte[] sh = sgn.getAuthenticatedAttributeBytes(hash, cal, null, null, CryptoStandard.CMS); 
     byte[] extSignature = signature.sign(sh); 

     System.out.println(signature.getEncryptionAlgorithm()); 

     // Calendar cal = Calendar.getInstance(); 
     sgn.setExternalDigest(extSignature, null, signature.getEncryptionAlgorithm()); 
    return sgn.getEncodedPKCS7(hash, cal, null, null, null, CryptoStandard.CMS); 

     } 
    public void createSignature(String src, String dest, String fieldname,byte[] hash, PrivateKey pk, Certificate[] chain) throws IOException, DocumentException, GeneralSecurityException { 

    PdfReader reader = new PdfReader(src); 
    FileOutputStream os = new FileOutputStream(dest); 
    ExternalSignatureContainer external = new MyExternalSignatureContainer(hash,chain,pk); 
    MakeSignature.signDeferred(reader, fieldname, os, external); 
} 


public static void main(String[] args) throws IOException, GeneralSecurityException, DocumentException { 
byte[] hh = app.emptySignature_hash(SRC, TEMP, "sig1", chain); 
byte[] hh_sign = (app.signed_hash(hh, pk, chain)); 

app.createSignature(TEMP, DEST1, "sig1",hh_sign, pk, chain); 

    } 
私はあなたが直接SHA512のようなものを使用して、そのバイトのPDFをハッシュ場合はPDFコンテンツが変更されますしない限り、ハッシュが同じすべての時間をとどまるべきであると推測
+0

延期署名 –

関連する問題