PHPセキュリティ対策:パスワード処理

(1/2)
認証を行う1つの方法としてパスワードがある。サーバ側でパスワードを保管する際には漏洩リスクがつきまとうので、暗号化して保管するのが定石である。
そこで今回は、パスワードの暗号化方法と、暗号化したパスワードと入力されたパスワードが合致するかどうかを判定する方法をPHPプログラムにして見る。

(2022年6月27日)FastCGIで正常動作しない不具合を修正
(2022年5月18日)大幅改訂,pahooInputData.php分離,PHP8対応

目次

サンプル・プログラムの実行例

PHPセキュリティ対策:パスワード処理

サンプル・プログラム

圧縮ファイルの内容
getValidString1.phpサンプル・プログラム本体。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「PHPでGET/POSTでフォームから値を受け取る」「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。

パスワードの暗号化

PHPによるパスワードの自動生成と、その強度測定については、「PHPでパスワードを生成」を参照していただきたい。ここでは、入力されたパスワードの保管と照合方法を紹介する。

まずパスワードの保管であるが、テキストファイルに保管するにせよ、データベースに保管するにせよ、そのまま保管してはならない。万が一、保管データが漏れてしまった場合、そのリスクはプログラム所有者が負うことになるためだ。定石として、パスワードは必ず暗号化して保管すること。

パスワードの暗号化方式は様々なものがあるが、UNIXでは古くからcrypt関数を使って暗号化してきた。PHPも、この流れを汲んでいる。

C言語のcrypt関数DES暗号をベースに、saltと呼ばれる12ビットのパラメーターを使って、暗号化テーブルを4,096通りに変化させる。
厳密に言うと、復号不可能なハッシュ関数として作用するので、暗号化ではなくハッシュ化である。
ただし、入力できるパスワード文字列は8文字以下で(8文字超の部分は無視される)、出力されるハッシュ値も64ビット(ASCII 8文字)と短いものなので、解読される恐れは十分ある。
したがって、cryptによるパスワードの暗号化保管に際しては、保管ディレクトリのアクセス権限を制限するなど他の機密対策も併用する必要がある。

ハッシュ関数

PHPの組み込み関数  crypt  は、DES以外のハッシュ関数を利用できるので、暗号化強度に関してはオリジナルのC言語関数より強くなっている。ただし、過信は禁物である。

ハッシュ関数にはさまざまなものがあるが、要点は2つ――
  1. 片方向関数である(ハッシュ値から元の値を求める逆関数は存在しない)
  2. 関数であるから、同じ値からは常に同じハッシュ値を出力する
ハッシュ関数の説明は、専門書や専門サイトに譲ることとして、ここでは、どうやってハッシュ化したデータとパスワードを一致させるかを説明しよう。
PHPセキュリティ対策:パスワード処理
初回は、上図左の流れである。
入力されたパスワードは、ハッシュ関数を通して、ハッシュ値となり、データベースなどに保管する。

2回目以降も、入力されたパスワードをハッシュ関数に通して、ハッシュ値を得る。ここで得たハッシュ値と、初回登録したハッシュ値を比較し、一致していれば、パスワードが一致したことになる。

参考サイト

(この項おわり)
header