文字列等の「情報のDNA」に相当するものをハッシュ値と呼びます。(遺伝子の説明等で用いられるDNAです。)ハッシュ値の特徴は次のものです。
- 暗号化の手法として良く用いられる。
- 復号できない。
- 暗号化の結果が固定長になる。
- まれに衝突が発生する。
特に最後の「まれに衝突が発生する」を補足するとexampleという7桁の文字列(文字コードはASCII)のSHA-1方式のハッシュ値は
c3499c2729730a7f807efb8676a92dcb6f8a3f8f
ですが、example以外の文字列(7桁とは限りません)であっても、上記と同じハッシュ値になることがある、ということです。
- PDELでは、ハッシュ値を次の二つの目的で使用しています。
- 復号の成功・失敗を判定するため。
PDELは「暗号化する文字列のハッシュ値」を「暗号化結果の文字列」に埋め込んでいます。そして復号時、「復号された文字列のハッシュ値」と「暗号化時に埋め込まれたハッシュ値」を比較し、同じであれば復号成功、異なれば復号失敗としています。
- セッション・ハイジャック・チェックを判定するため。
PDELでのセッション・ハイジャック・チェックは「キー項目を連結した文字列のハッシュ値」を「暗号化結果の文字列」に埋め込んでいます。そして「復号時のキー項目を連結した文字列のハッシュ値」と「暗号化時に埋め込まれたキー項目のハッシュ値」を比較し、異なればセッション・ハイジャックされたとみなしています。
- PDELのハッシュ値算出方式は、衝突の可能性の高い順に、CRC32、MD5、SHA-1の3種類から選択可能です。(いずれもPHP標準関数で提供されているものです。)
- 厳密にはCRC32はチェックサムと呼ばれ、ハッシュ値と呼ぶことは情報工学的に不正確かも知れませんが、ハッシュ値の特徴を備えているので、PDELではハッシュ値として扱っています。(CRC32には更にいくつかの方式があり、PDELではcrc32bと呼ばれる方式を用いています。PHP関数のcrc32が、crc32b方式を採用しているからです。興味のある人はPHP関数のcrc32・hash_algos・hashで確認してください。)
- PDELとは無関係ですが、ハッシュ値の話なので参考までに。パスワードをなんの工夫もせずMD5やSHA-1のみで暗号化しているシステムがありますが、あまり好ましいことではありません。パスワード以外の別の文字列(saltと呼ばれます)をパスワードと連結し、そのうえで暗号化したほうが好ましいです。saltも固定値ではなく、ユーザーごとに異なり、なおかつ絶対に変更されない情報(ユーザーID、入会日・初期登録日等)を基に生成した文字列で決定したほうが、より好ましいです。