アクセシビリティ
デベロッパーリソース
Dimosthenis Theodoridis

Dimosthenis Theodoridis

Adobe

作成日:
2009年6月22日
製品:
LiveCycle

ダイナミックPDFフォームでのハッシュの生成および操作

PDFフォームにパスワードが表示されないようにし、さらにソースコードやPDFドキュメント内にもパスワードがクリアテキストで保存されないようにするには、MD4、MD5、SHA-1、およびSHA-256ハッシュの生成方法と操作方法を知る必要があります。

この方法では、一意のハッシュを生成してPDFドキュメントに保存することで、パスワードを難読化します。この一意のハッシュは様々なハッシュ関数で生成できます。この記事では、PDFフォームの内部でハッシュを生成して操作する方法について説明します。

ハッシュ関数は可変長の文字列(またはメッセージ)の入力から固定長の文字列を出力として作成します。この出力はメッセージダイジェスト、またはデジタル指紋と呼ばれる場合もあります。

Adobe LiveCycle Designer ESを使用すると、様々なハッシュ関数をJavaScriptとしてスクリプトオブジェクトに実装し、ダイナミックPDFドキュメント内で実行できます。この記事のサンプルファイルに含まれているPDFの例には、次のハッシュ関数のオープンソースの実装が使用されています。

  • Ronald Rivestの設計によるMD4およびMD5
  • NISTによって定義されたSHA-1およびSHA-256

ハッシュを使用する最大の利点は、クリアテキスト文字列の比較でパスワードを直接比較するのではなく、2つのパスワードの2つのハッシュを比較できることです。2つの異なった文字列が同じハッシュを持つ可能性は非常に低いため、両方のハッシュが同一であれば、比較された文字列(この場合はパスワード)も同一であると推測できます。

注意:MD4またはMD5には、よく知られているセキュリティ上の問題(いわゆるハッシュの衝突)があります。ハッシュの衝突や他のSHA-1がハックされているという問題(レインボーテーブルを含む)があることから、2番目のサンプルではSHA-256ハッシュ関数に重点を置くことにしました。詳しくは、Wikipediaの衝突およびレインボーテーブルのページを参照してください。

必要条件

この記事を効率良くフォローするには、次のソフトウェアやファイルが必要です。

LiveCycle ES

サンプルファイル:

この記事に必要な予備知識

Adobe LiveCycle Designer ESの使用経験とスクリプトオブジェクトの関数にアクセスして呼び出すことができる知識。

スクリプトオブジェクトの検討

LiveCycle Designer ESで、提供された2つのファイルのいずれかを開くと、階層パレットに4つのスクリプトオブジェクトが表示されます(図1参照)。

スクリプトオブジェクト

図1. スクリプトオブジェクト

これらのスクリプトオブジェクト内のハッシュ関数のJavaScript実装を確認するには、スクリプトオブジェクトを選択し、スクリプトエディターでコードを調べます。次の各ハッシュ関数がどのように実装されているかを確認できます。

  • soHASHING_MD4.hex_md4()
  • soHASHING_MD4.b64_md4()
  • soHASHING_MD4.str_md4()
  • soHASHING_MD5.hex_md5()
  • soHASHING_MD5.b64_md5()
  • soHASHING_MD5.str_md5()
  • soHASHING_SHA1.hex_sha1()
  • soHASHING_SHA1.b64_sha1( )
  • soHASHING_SHA1.str_sha1( )
  • soHASHING_SHA256.hex_sha256()
  • soHASHING_SHA256.b64_sha256()
  • soHASHING_SHA256.str_sha256()

このリストからわかるように、ハッシュの様々な出力形式に対して、様々な関数が使用できます。16進数には「hex_」、Base64エンコードされた出力には「b64_」、単純な文字列エンコードには「str_」を選択できます。

選択するハッシュ関数によって、ハッシュの長さも変わります。

  • MD4:128ビット
  • MD5:128ビット
  • SHA-1:160ビット
  • SHA-256:256ビット

サンプルPDFフォームの試用

この記事のサンプルファイルには、2つのPDFフォームが含まれています。最初のサンプルは、文字列が入力されると、その文字列に対してMD4、MD5、SHA-1、およびSHA-256ハッシュ値を生成します。2番目のサンプルは簡単なフォームで、正しいパスワードが入力されるとテキストフィールドのロックを解除します。

サンプル1:ハッシュの生成

次のステップに従って、最初のサンプルを試してみましょう。

  1. サンプルファイルをダウンロードして解凍したら、Adobe LiveCycle Designer ESでhashing_forms_sample1.pdfを開きます。Adobe ReaderまたはAdobe Acrobat Professionalでもサンプルを開いて表示できますが、ソースコードは確認できません。
  2. 「clear text」というラベルの付いたテキストフィールドにパスワード、またはハッシュするその他のメッセージを入力します。
  3. 4つのボタンのいずれかをクリックして、MD4、MD5、SHA-1、またはSHA-256ハッシュを生成します。どのボタンを押したかによって、16進数の出力を作成する4つのハッシュ関数のいずれかが呼び出され、入力した文字列またはメッセージがハッシュされます。

ハッシュ処理の結果が「hash」というラベルの付いたフィールドに表示されます。ハッシュの長さは選択したハッシュ関数によって異なります。

すべてのサンプルで出力形式には16進数が使用されています。スクリプトエディターを使用してサンプルを変更し、出力形式をBase64または単純な文字列に変更できます。

サンプル2:パスワードの照合

2番目のサンプルでは、実際のパスワードを確認できないようにするため、バックグラウンドでのハッシュの比較がどのように行われているかを示します。入力したパスワードがハッシュされます。非表示フィールドに保存された実際のパスワードもハッシュされます。パスワードが安全であるのは、パスワードが見えなくなっているからではなく、ハッシュされているからです。ハッシュ値からパスワードを再構築することは不可能なため、ハッシュされた形のパスワードが見られても安全です。比較はハッシュ間でのみ行われ、クリアテキストのパスワード間では行われません。両方のハッシュが同一であれば、パスワードも同一であると推測できます。

次のステップに従って、2番目のサンプルを試してみましょう。

  1. Adobe LiveCycle Designer ESでhashing_forms_sample2.pdfを開きます。Adobe ReaderまたはAdobe Acrobat Professionalでもサンプルを開いて表示できますが、ソースコードは確認できません。
  2. 「Password MAN」または「Password WOMAN」というラベルの付いた2つのパスワードフィールドのいずれかを選択して、パスワードを入力します。
    1. 男性用のパスワードは「bob」です。
    2. 女性用のパスワードは「alice」です。
  3. パスワードフィールドからフォーカスを移動させたり、Enterキーを押したりすると、入力したパスワードのハッシュが自動的に生成され、正しいパスワードの保存済みハッシュとバックグラウンドで比較されます。正しい、ハッシュされたパスワードは「passwd_man_hashed」および「passwd_woman_hashed」というラベルの付いた非表示テキストフィールドに保存されます。男性用の正しいパスワードを入力すると、「Man 1」および「Man 2」というラベルの付いたテキストフィールドがアクセス可能になり、テキストが入力できるようになります。女性用のフィールドにも同じ動作が適用されます。
  4. オプションで「delete passwords」というラベルの付いたボタンをクリックすると、テキストフィールドが無効になり、枠線が変更されます。

2つのハッシュ値を比較し、テキストフィールドを有効にするコードは簡単です。

if (soHASHING_SHA256.hex_sha256(this.rawValue) == passwd_man_hashed.rawValue){
     VAL_man_1.access = "open";
     VAL_man_2.access = "open";
     VAL_man_1.borderColor = "0,255,0";
     VAL_man_2.borderColor = "0,255,0";
}

次のステップ

このコードはどのような場合に必要なのでしょうか。承認された人物だけが入力できるPDFフォームを考えてみましょう。Sample_2.pdf*のように、ドキュメントのどこにもクリアテキストとして表示されないパスワードでフィールドをセキュリティ保護すると、パスワードを知っているユーザーのみがフィールドにアクセス可能になります。

2つのサンプルPDFファイルも引き続き研究されることをお勧めします。Sample_1.pdf*を使用して新しいハッシュ値を生成したり、生成された値を使用して、Sample_2.pdfで使用されるパスワードやハッシュ関数を変更できます。ご協力・謝辞セクションに記載されたリソースでも、ハッシュの作成や、この記事で使用されているJavaScript実装に関する他の情報が提供されています。

ご協力・謝辞

Creative Commons License
この記事は、Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported Licenseのもと提供しています。

著者について

Dimosthenis Theodoridisは、アドビ システムズ社のAdobe Professional Services EMEA部のテクニカルアーキテクトです。Dimoは、アドビ システムズ社に4年以上勤務しており、ドイツのミュンヘン市に居を構えています。