【PHP・文字列関数】 md5/crypt関数の使い方(ハッシュを作成する)

アイキャッチ画像ハッシュ PHP
PHP
この記事は約5分で読めます。
Recommended Articles

【PHP】 md5関数/crypt関数の使い方(ハッシュを作成する)

md5関数の使い方(MD5ハッシュを作成する)

php3~ で使用できます。

md5関数 : 書式
md5(文字列 [, True | False ])
(第2引数省略時:False)
戻り値:MD5に基づいて作成されたハッシュ値
 md5関数はMD5(Messae Digest 5)アルゴリズムに基づいたハッシュ値を作成します。32文字の16進形式で作成しますが、第2引数でTRUEが指定した場合、16バイト長のバイナリ形式で返します。crypt関数と同じように、md5関数も不可逆であるハッシュ値を生成し、複合できるわけではないので「暗号化」とは異なります。
 主な用途としては、
  1. パスワードの暗号化
  2. ユニークなキーの処理

の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関数 : 書式
crypt( 文字列 [,暗号のベースとなる2文字] )

戻り値:DESに基づいて作成されたハッシュ値
 crypt関数はDES(Data Encryption Standard)アルゴリズムによってハッシュ値を作成します。複合できない不可逆関数で、パスワードの暗号化で使われることが多いです。第2引数は、暗号化された文字列のベースとなる2文字を指定可能で、省略した時は、自動で文字が付加されます

システムによっては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)、つまりデコードされます。

関連リンク

PHPトップページ
PHP入門 & 関数リファレンス
PHPの初心者からベテランまで活用できるページです。初めての方はもちろん、もう一度基礎から学びなおしたい方は、基礎知識のページを順に読んで理解しましょう。ベテランの方向けには、関数の書式・パラメーターを調べられる構成になっています。PHPプログラム作成時にご活用下さい。
Recommended Articles