iTextとブロックチェーン

iTextとブロックチェーンの利用により、iTextにブロックチェーン技術が統合され、PDF文書ではなく、ブロックチェーンにデジタル署名を保存できるようになります。

機能とメリット

**

iTextとブロックチェーンのチュートリアル・ビデオ

主な機能

ブロックチェーン内のデータ

  • 既知のPKIインフラストラクチャを使用して署名できます。
  • 自動的に検証され、タイムスタンプが付きます。
  • 誰もが見ることができます
  • 参照する物理(実世界)データとは別に存在します。

PDFとの関係:

  • PDF文書にはデジタル署名が可能です。
    • 認証局(中央)が必要です。
    • タイムサーバー(中央)が必要です。
    • 並行して署名することはできません。
    • 署名はドキュメント内に存在します。
  • 信頼のWeb
  • 整合性: "この文書にはこの正確な内容が含まれています。"
  • 認証: "私はこの文書を作成しました。 そして、私はそれを証明することができます。"
  • 否認防止: "彼はこの文書を作成しました。 そして、私はそれを証明することができます。"
  • タイムスタンプ

ブロックチェーン

iTextとブロックチェーンを使用するメリット

ブロックチェーンにはデータが格納されますが、このデータは「ブロック」という単位で収集されます。ブロックチェーン技術には、このブロックが改ざんされていないことを証明するメカニズムがあります。経時的に、ブロックが集まってチェーンになり、このチェーンが有機的に一種の「履歴」となるのです。

ブロックチェーン技術

ブロックチェーンは、認証と否認不可を処理する古い技術に代わる仕組みです。まず、文書にデジタル署名する方法は多数あります。一般的に「署名」とは、文書のハッシュを作成し、秘密鍵を使用してハッシュから署名を作成して、署名を保存することを意味します。これには次の2つの効果があります。

  1. 署名は、文書に署名したユーザーを特定します。
  2. 署名が復号化されるときには、演算の元になったファイルを特定します。

    このような署名がブロックチェーンに保存されると、変更または削除できません。これには別の利点があります。

  3. 署名がブロックチェーンに格納されることにより、操作が実行された時点がわかります。

後になってから、次のように言うことができます。「私は2016年10月10日にこのハッシュを作成しました。これは、ブロックチェーン内のハッシュを含むトランザクションです。私は、これを、このファイルから、この式に従って作成しました。」 現在、どのユーザーもファイルを取得し、ハッシュをもう一度計算して、ブロックチェーン内にあるハッシュと一致することを確認できます。すべては次の理由で機能します。

  1. ファイルからハッシュを計算することは簡単にできますが、まったく同じハッシュを生成する同様のファイルを偽造することは非常に困難です。
  2. ブロックチェーン内に保存されたデータを変更することはほぼ不可能です。
  3. ブロックチェーン内のすべてのトランザクションにはタイムスタンプがあるため、トランザクションによってその実行日時を正確に把握できます。

理論的な使用例 - 概要レベル

概要レベルでは、PDFから署名機能と整合性を分離し、これらをブロックチェーンに取り込みます。たとえば、次のような使用事例があります。

  1. 文書が作成され、文書ID(およびそのハッシュとハッシュ・アルゴリズムの名前)が公開ブロックチェーンに格納されます。これによる問題の発生はありません。一般的に、ハッシュでは文書全体を再構築することができないためです。当社は、ハッシュ・アルゴリズムをチェーンに取り込み、長期的な検証を保証します。
  2. 次に、この文書が請求書であったとします。ボブは自宅の改装を行い、リフォーム会社から請求書が送られます。
  3. ボブは請求書に署名し、価格に同意し、支払うことを示したいと思っています。ボブの秘密鍵が、文書のハッシュ値を暗号化するために使用されます。この署名(文書ID、元のハッシュ値、署名されたハッシュ値、ハッシュ・アルゴリズムと署名アルゴリズムの名前を含む)がブロックチェーンに格納されます。
  4. リフォーム会社に勤務するアリスは、ボブが既に署名したかどうかを確認したいと思っています。彼女は、特定のID(文書ID)のすべての記録をブロックチェーンで簡単に検索できます。これらの記録の1つが、ボブが既に作成したレコードであるはずです。 レコードには元のハッシュと関連するすべてのアルゴリズムの名前が含まれるため、アリスは次の2つの点を検証できます。
    • そのハッシュ、署名されたハッシュ、およびボブの公開鍵を使用して、署名した人がボブであること。
    • ボブが、その文書IDとハッシュを使用して、彼女から送信された文書に署名したこと。

ブロックチェーン - 概要レベルの概念

理論的な使用例 - 詳細レベル

実装

当社がブロックチェーン実装で採用するインターフェイスは最低限のものですが、必要な抽象化を提供するため、その上に複雑なアプリケーションとワークフローを構築できます。当社はブロックチェーンをマルチマップとして抽象化するため、エンドユーザーはオブジェクト(ハッシュマップ<string, object>であるレコードによって表される)を格納し、 キー(文字列)に関連づけることができます。

public interface IBlockChain {
 
    /**
     * データをブロックチェーンに配置する
     *
     * @param key  ブロックチェーンにデータを配置するために使用されるキー
     * @param data  ブロックチェーンに配置されるデータ
     */
    public boolean put(String key, Record data);
 
    /**
     * ブロックチェーンからデータを取得する
     *
     * @param key 照会されるキー
     * @return
     */
    public List<Record> get(String key);
 
    /**
     * ブロックチェーンからすべてのデータを取得する
     * @return
     */
    public List<Record> all();
}


JSON-RPCとMultiChainを使用して実装を具体化する

概念実証として、当社は、SON-RPC(リモート・プロシージャ・コール)とMultiChainを使用して、インターフェイスIBlockchainの実装を提供しています。

MultiChainを使用してブロックチェーン・インスタンスを設定する詳細な方法については、その他のリソースに関するWebサイト(特に、基本操作ガイド)を確認してください。


iTextとブロックチェーンの例

この例では、文書と署名をブロックチェーンに格納する方法を示します。

       IBlockChain mc = new MultiChain(
                "http://127.0.0.1",
                4352,
                "chain1",
                "stream1",
                "multichainrpc",
                "BHcXLKwR218R883P6pjiWdBffdMx398im4R8BEwfAxMm");
 
        InputStream keystoreInputStream = BasicFunctionalityTest.class.getClassLoader().getResourceAsStream("ks");
        InputStream inputFileStream = BasicFunctionalityTest.class.getClassLoader().getResourceAsStream("input.pdf");
 
        AbstractExternalSignature sgn = new DefaultExternalSignature(keystoreInputStream, "demo", "password");
 
        PdfChain chain = new PdfChain(mc, sgn);
 
        // put a document on the chain
        boolean wasAdded = chain.put(inputFileStream);
        Assert.assertTrue(wasAdded);
 
        // check whether the chain now contains this value
        boolean isEmpty = chain.get("z�L{�Wd=��\u007F\u0010��G�").isEmpty();


次のように、ブロックチェーンから文書情報を取得できます。

  IBlockChain mc = new MultiChain(
                "http://127.0.0.1",
                4352,
                "chain1",
                "stream1",
                "multichainrpc",
                "BHcXLKwR218R883P6pjiWdBffdMx398im4R8BEwfAxMm");
 
        PdfChain chain = new PdfChain(mc);
 
        for(Record record : chain.get(new File("example_file.pdf")))
        {
            for(Map.Entry<String,Object> en : record.entrySet())
            {
                System.out.println(en.getKey() + "\t" + en.getValue().toString());
            }
            System.out.println("");
        }