web-dev-qa-db-ja.com

PDFに何らかのデジタル署名があるかどうかを確認する方法

PDFにあらゆる種類のデジタル署名があるかどうかを理解する必要があります。巨大 PDFを管理する必要があります。たとえば、それぞれ500MBなので、方法を見つける必要があります署名されたものと署名されていないものを区別します(そのため、署名されたPDFをそれらを管理するメソッドに送信できます)これまでに見つかった手順には、Bouncycastle libs(私の場合、Javaの場合)を介して証明書を抽出する試みが含まれます。 pdfは、存在しない場合や例外が発生した場合でも署名されますが、そうではありません(sic!)が、リソースを浪費する実装の例を除いて、明らかに時間とメモリを消費します。

言語に依存しない簡単な方法はありますか? PDFファイルを開き、最初のバイトを読み取り、そのファイルに署名が付いていることを示す情報を見つけますか?または、内部的にPDFを作成する方法を詳細に説明しているリファレンスマニュアルがありますか?

前もって感謝します

9
Sampisa

PDF Libraryをすべて自分で実装しようとするのではなく、使用したいとします。そうしないと、線形化されたドキュメント、フィルター、増分更新、オブジェクトストリームのバリエーションを処理することに行き詰まってしまいます。相互参照ストリームなど。

参考資料に関して;私の大まかな検索によれば、AdobeはISO 32000:2008仕様のバージョンを誰にも提供していないようですが、その仕様は主に PDF v1.7リファレンスマニュアル の翻訳ですISO準拠の言語。

したがって、PDF v1.7リファレンスを想定すると、最も関連するセクションは8.7(デジタル署名)、3.6.1(ドキュメントカタログ)、および8.6(インタラクティブフォーム)になります。

基本的なプロセスは次のようになります。

  1. 「Perms」および「AcroForm」エントリのドキュメントカタログをお読みください。
  2. 「Perm」辞書を読んで、「DocMDP」、「UR」、または「UR3」エントリを探します。これらのエントリが存在する場合は、ほとんどの場合、認定済みドキュメントまたはリーダー対応ドキュメントのいずれかを持っています。
  3. 「AcroForm」エントリを読みます。 (「XFA」エントリがないことを確認してください。PorgyとBessからのFraizerの言葉では、Datは複雑です!)。基本的に、最初に(オプションの) 'SigFlags'エントリがあるかどうかを確認します。この場合、ゼロ以外の値はフィールド配列に署名があることを示します。それ以外の場合は、 'Fields'配列の各エントリを調べて、 'FT'(フィールドタイプ)エントリが 'Sig'(シグネチャ)に設定され、 'V'(値)エントリがヌル。

PDFライブラリを使用して、ドキュメントの相互参照テーブルを使用して適切な間接オブジェクトにナビゲートできるため、証明書のドキュメントをブルートフォースで検索するよりも、リソースを大量に消費する必要がなくなります。 。

5
Patrick Gallot

これは最適なソリューションではありませんが、別のソリューションです... "Sigflags"を確認して、最初の一致で停止することができます。

grep -m1 "/Sigflags" ${PDF_FILE}

または、ディレクトリ内にそのようなファイルを取得します。

grep -r --include=*.pdf -m1 -l "/Sigflags" . > signed_pdfs.txt

grep -r --include=*.pdf -m1 -L "/Sigflags" . > non_signed_pdfs.txt

大きなファイルの場合、Grepは非常に高速です。これを一定の時間バッチで実行し、その後結果のリスト(.txtファイル)を処理できます。

ファイルは署名後に段階的に変更される可能性があり、最後のバージョンは署名されない可能性があることに注意してください。それが「署名済み」の実際の意味になります。

とにかく、ファイルに/ Sigflagsstringがない場合は、署名されていないことがほぼ確実です。

すべてのオブジェクトがどこにあるかを示す相互参照テーブルがあるため、適合リーダーは(ファイルの最後から)逆方向に読み取りを開始することに注意してください。

peepdf を使用してファイルの内部構造を確認することをお勧めします。ファイルに対するコマンドの実行をサポートします。例えば:

 $ peepdf -C "search /SigFlags" signed.pdf 

   [6]

  $ peepdf -C "search /SigFlags" non-signed.pdf 

    Not found!!

しかし、私はそのパフォーマンスをテストしていません。これを使用して、PDF PDF v1.7 Reference からの学習の内部構造を参照できます。PDF例があります。

3
yucer