動的 PDF Forms でのハッシュの生成と操作 generate-work-with-hashes-dynamic-pdf-forms
必要な知識 prerequisite-knowledge
スクリプトオブジェクトの関数にアクセスして呼び出すことができるなど、AEM Forms on JEE Designer に関する経験が必要です。
ユーザーレベル user-level
経験の浅いユーザー
PDF フォームのパスワードを非表示にする場合や、ソースコード内または PDF ドキュメント内でパスワードをクリアテキストで表示しない場合は、MD4、MD5、SHA-1、SHA-256 といったハッシュの生成方法や操作方法についての知識が重要となります。
一意のハッシュを生成し、このハッシュを PDF ドキュメントに保存することでパスワードを難読化するという考え方に基づいています。この一意のハッシュは、様々なハッシュ関数で生成することができます。この記事では、これらのハッシュを PDF フォーム内で生成する方法とその操作方法を示します。
ハッシュ関数は、任意の長さの長い文字列(またはメッセージ)を入力として取り、出力として固定長の文字列を生成します。これは、メッセージダイジェストやデジタルフィンガープリントと呼ばれることがあります。
JEE Designer 上の AEM Forms では、スクリプトオブジェクトに様々なハッシュ関数を JavaScript として実装して、ダイナミック PDF ドキュメント内で実行できます。この記事のサンプルファイルに含まれている PDF 例では、次のハッシュ関数のオープンソース実装を使用しています。
-
MD4 と MD5 - ロナルド・リベストによる設計
-
SHA-1 と SHA-256 - NIST で定義されるもの
ハッシュを使用する最大の利点は、パスワードを比較する際に各パスワードのハッシュを比較することができ、クリアテキストの文字列を直接比較する必要がなくなる点です。2 つの異なる文字列が同じハッシュを持つ可能性は非常に低いので、両方のハッシュが同じであれば、比較対象の文字列(この場合はパスワード)も同一であると見なすことができます。
スクリプトオブジェクトの調査 examining-script-objects
提供されている 2 つのサンプルの 1 つを JEE Designer 上の AEM Forms で開くと、階層パレットに 4 つのスクリプトオブジェクトが表示されます(下図を参照)。
これらのスクリプトオブジェクト内のハッシュ関数の 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 フォームの試用 try-sample-pdf-forms
この記事のサンプルファイルには、2 つの PDF forms が含まれます。最初のサンプルでは、文字列を入力し、その文字列の MD4、MD5、SHA-1 および SHA-256 ハッシュ値を生成できます。2 つ目のサンプルは、正しいパスワードが入力された場合にテキストフィールドのロックを解除する単純なフォームです。
例 1:ハッシュの生成 generating-dashes
最初のサンプルを試すには、次の手順に従います。
- サンプルファイルをダウンロードして解凍したら、JEE Designer 上の AEM Forms で hashing_forms_sample1.pdf を開きます。または、Adobe Reader や Adobe Acrobat Professional を使用してサンプルを開いて表示することもできますが、ソースコードは表示されません。
- テキストを消去というラベルの付いたテキストフィールド内で、ハッシュ化するパスワードまたはその他のメッセージを入力します。
- 4 つのボタンのいずれかをクリックして、MD4、MD5、SHA-1、または SHA-256 ハッシュを生成します。押したボタンに応じて、16 進数出力を生成する 4 つのハッシュ関数の 1 つが呼び出され、文字列またはメッセージがハッシュ化されます。
ハッシュ操作の結果が、ハッシュというラベルの付いたフィールドに表示されます。ハッシュの長さは、選択したハッシュ関数によって異なります。
すべてのサンプルでは、出力タイプとして 16 進数を使用します。スクリプトエディタを使用してサンプルを変更し、出力タイプを Base64 または単純な文字列に変更できます。
例 2:一致するパスワード matching-passwords
2 つ目のサンプルは、実際のパスワードを公開する必要なく、バックグラウンドでハッシュを比較する仕組みを示しています。入力したパスワードはハッシュ化されます。実際のパスワードは、非表示のフィールドに保存され、ハッシュ化されます。パスワードは、非表示となっているためではなく、ハッシュ化されることで保護されます。ハッシュ値からパスワードを再構築することは不可能なので、ハッシュ化された形のパスワードは公開しても安全です。比較はハッシュ間でのみ行われ、クリアテキスト内のパスワード間では行われません。両方のハッシュが同じ場合は、パスワードが同一であると仮定できます。
2 番目のサンプルを試すには、次の手順に従います。
-
JEE Designer 上の AEM Forms を使用して
hashing_forms_sample2.pdf
を開くまたは、Adobe Reader や Adobe Acrobat Professional を使用してサンプルを開いて表示することもできますが、ソースコードは表示されません。 -
Password MAN または Password WOMAN のラベルが付いた 2 つのパスワードフィールドの 1 つを選択し、パスワードを入力します。
- その男性のパスワードは
bob
- その女性のパスワードは
alice
- その男性のパスワードは
-
フォーカスをパスワードフィールドから移動するか、Enter キーを押すと、入力したパスワードのハッシュが自動的に生成され、バックグラウンドで保存されている正しいパスワードのハッシュと比較されます。正しい、ハッシュ化されたパスワードは、
passwd_man_hashed
およびpasswd_woman_hashed
のラベルが付いた非表示のテキストフィールドに保存されます。その男性の正しいパスワードを入力した場合は、Man 1
およびMan 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";
}
ここからの移動先 next-steps
この機能が必要となるのはどのような状況でしょうか。PDF フォームに、承認された個人のみに入力を制限するフィールドがあるとします。Sample_2.pdf のように、ドキュメント内のどのクリアテキストでも表示されないパスワードでこれらのフィールドを保護すると、パスワードを知っているユーザーのみがこれらのフィールドにアクセスできるようになります。
引き続き 2 つのサンプル PDF ファイルを参照してください。Sample_1.pdf で新しいハッシュ値を生成し、生成された値を使用して、Sample_2.pdf で使用するパスワードまたはハッシュ関数を変更できます。「属性」の節に記載されているリソースでは、ハッシュとこの記事で使用される特定の JavaScript 実装に関する追加情報も提供しています。