
Adobe
PDFフォームにパスワードが表示されないようにし、さらにソースコードやPDFドキュメント内にもパスワードがクリアテキストで保存されないようにするには、MD4、MD5、SHA-1、およびSHA-256ハッシュの生成方法と操作方法を知る必要があります。
この方法では、一意のハッシュを生成してPDFドキュメントに保存することで、パスワードを難読化します。この一意のハッシュは様々なハッシュ関数で生成できます。この記事では、PDFフォームの内部でハッシュを生成して操作する方法について説明します。
ハッシュ関数は可変長の文字列(またはメッセージ)の入力から固定長の文字列を出力として作成します。この出力はメッセージダイジェスト、またはデジタル指紋と呼ばれる場合もあります。
Adobe LiveCycle Designer ESを使用すると、様々なハッシュ関数をJavaScriptとしてスクリプトオブジェクトに実装し、ダイナミックPDFドキュメント内で実行できます。この記事のサンプルファイルに含まれているPDFの例には、次のハッシュ関数のオープンソースの実装が使用されています。
ハッシュを使用する最大の利点は、クリアテキスト文字列の比較でパスワードを直接比較するのではなく、2つのパスワードの2つのハッシュを比較できることです。2つの異なった文字列が同じハッシュを持つ可能性は非常に低いため、両方のハッシュが同一であれば、比較された文字列(この場合はパスワード)も同一であると推測できます。
注意:MD4またはMD5には、よく知られているセキュリティ上の問題(いわゆるハッシュの衝突)があります。ハッシュの衝突や他のSHA-1がハックされているという問題(レインボーテーブルを含む)があることから、2番目のサンプルではSHA-256ハッシュ関数に重点を置くことにしました。詳しくは、Wikipediaの衝突およびレインボーテーブルのページを参照してください。
この記事を効率良くフォローするには、次のソフトウェアやファイルが必要です。
Adobe LiveCycle Designer ESの使用経験とスクリプトオブジェクトの関数にアクセスして呼び出すことができる知識。
LiveCycle Designer ESで、提供された2つのファイルのいずれかを開くと、階層パレットに4つのスクリプトオブジェクトが表示されます(図1参照)。

図1. スクリプトオブジェクト
これらのスクリプトオブジェクト内のハッシュ関数のJavaScript実装を確認するには、スクリプトオブジェクトを選択し、スクリプトエディターでコードを調べます。次の各ハッシュ関数がどのように実装されているかを確認できます。
このリストからわかるように、ハッシュの様々な出力形式に対して、様々な関数が使用できます。16進数には「hex_」、Base64エンコードされた出力には「b64_」、単純な文字列エンコードには「str_」を選択できます。
選択するハッシュ関数によって、ハッシュの長さも変わります。
この記事のサンプルファイルには、2つのPDFフォームが含まれています。最初のサンプルは、文字列が入力されると、その文字列に対してMD4、MD5、SHA-1、およびSHA-256ハッシュ値を生成します。2番目のサンプルは簡単なフォームで、正しいパスワードが入力されるとテキストフィールドのロックを解除します。
次のステップに従って、最初のサンプルを試してみましょう。
ハッシュ処理の結果が「hash」というラベルの付いたフィールドに表示されます。ハッシュの長さは選択したハッシュ関数によって異なります。
すべてのサンプルで出力形式には16進数が使用されています。スクリプトエディターを使用してサンプルを変更し、出力形式をBase64または単純な文字列に変更できます。
2番目のサンプルでは、実際のパスワードを確認できないようにするため、バックグラウンドでのハッシュの比較がどのように行われているかを示します。入力したパスワードがハッシュされます。非表示フィールドに保存された実際のパスワードもハッシュされます。パスワードが安全であるのは、パスワードが見えなくなっているからではなく、ハッシュされているからです。ハッシュ値からパスワードを再構築することは不可能なため、ハッシュされた形のパスワードが見られても安全です。比較はハッシュ間でのみ行われ、クリアテキストのパスワード間では行われません。両方のハッシュが同一であれば、パスワードも同一であると推測できます。
次のステップに従って、2番目のサンプルを試してみましょう。
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 Attribution-Noncommercial-Share Alike 3.0 Unported Licenseのもと提供しています。
Dimosthenis Theodoridisは、アドビ システムズ社のAdobe Professional Services EMEA部のテクニカルアーキテクトです。Dimoは、アドビ システムズ社に4年以上勤務しており、ドイツのミュンヘン市に居を構えています。