【PHP】 md5関数/crypt関数の使い方(ハッシュを作成する)
md5関数の使い方(MD5ハッシュを作成する)
php3~ で使用できます。
md5関数 : 書式
(第2引数省略時:False)
戻り値:MD5に基づいて作成されたハッシュ値
- パスワードの暗号化
- ユニークなキーの処理
の2つです。パスワードの暗号化は文字通り、パスワードを引数としてハッシュ値を作成する処理です。ユニークなキーの処理では、microtime関数やrand関数●などを引数として指定して、取得した数値を文字列に変換するものです。
md5関数 : 使用例
- MD5ハッシュを作成するecho md5("pass1234"); →「b4af804009cb036a4ccdc33431ef9ac9」を出力
$pass = md5("pass1234", TRUE); →16バイトのバイナリ形式で作成
echo bin2hex($pass); →「b4af804009cb036a4ccdc33431ef9ac9」を出力
<解説>
上記2つの例は同じハッシュ値を作成しますが、形式が異なります。第2引数にTRUEを指定すると16バイトのバイナリ形式で作成されます。バイナリ形式で作成した値をbin2hex関数●で16進む形式に変換すると、同じ値であることを確認できます。 - ユニークな文字列を作成するecho md5(microtime()); →「dc68d36cf760964f7e6441630bb8bdeb」を出力
<解説>
microtime関数によって取得したタイムスタンプを元にハッシュ値を生成します。32桁の文字列として各種キーとして使用できます。
md5関数 : 参考
- ファイルのMD5ハッシュを取得するecho md5_file("abc.txt"); →「e859da79617ce00b180e2dff60f3de6b」を出力
<解説>
文字列ではなくファイル名からMD5ハッシュを計算するにはmd5_file関数を使います。 - sha1ハッシュを取得するecho sha1(microtime()); →「4102b33829974ae69252567df835e8dc9715fbad」を出力
- ファイルのsha1ハッシュecho sha1_file("abc.txt"); →「29de1c1313474b1a72a10fe1ac043f0a0379780f」を出力
<解説>
ファイルのsha1ハッシュを計算するには、sha1_file関数を使います。
crypt関数の使い方(DESハッシュを作成する)
php3~ で使用できます。
crypt関数 : 書式
戻り値:DESに基づいて作成されたハッシュ値
システムによってはDESアルゴリズムではなく、上述のMD5アルゴリズムが使用されることがあります。
crtpt関数によって暗号化された文字列がよく使われるのは、パスワードの検証です。ユーザー登録などでパスワードを登録するときに暗号化してデータベースに格納しておき、ログイン画面から入力されたパスワードと照合します。
crypt関数 : 使用例
- 文字列を暗号化するecho crypt("pass1234","ab"); →「abd0Tdy4Pjlq6」を出力①
echo crypt("pass12345678","ab"); →「abd0Tdy4Pjlq6」を出力②
echo crypt("pass12345678","xy"); →「xyW4KMS.Cdqe」を出力
echo crypt("pass1234"); →「$1$1D4..F/.$VhQw9VJaPLrR7EEQzgdov1」を出力<解説>
crypt関数は指定された文字列の最初の8文字を使います。よって、①②のように最初の8文字と暗号のベースとなる2文字が同じであれば、同じ結果になります。 - パスワードを照合する$pass = crypt("pass1234"); →「pass1234」を複合化して登録
if (crypt($_POST["pass"], $pass) == $pass) {
echo "パスワード一致";
}<解説>
この例ではパスワードを複合化するときにベース文字列を指定していません。このような時は、照合する値(ここでは「$_POST["pass"]」)を複合化するときにベース文字列として暗号化された値(ここでは$pass)を指定します。これは異なるアルゴリズムによって暗号化され、うまく比較できなくなることを防ぐためです。
crypt関数 : 参考
- 文字列をrot13で暗号化するecho str_rot13("abc123"); →「nop123」を出力
echo str_rot13("nop123"); →「abc123」を出力<解説>
暗号化という機能では、str_rot13関数があります。これはアルファベットを13文字ずらす(rotate)ものです。アルファベットは26文字なので、暗号化された結果をstr_rot13関数の引数とすると元の文字列に戻る(例a→n→a)、つまりデコードされます。