はじめに
理想的な世の中では、「暗号化」や「セキュリティ」といった言葉は存在すらしないでしょう。しかし現実の世界は完全とはほど遠いものです。ですから、ソフトウェア開発者はアプリケーションのセキュリティ対策に相応の時間をかけなければなりません。暗号化はSSL/TLS、証明書、デジタル署名などと同様、セキュリティというパズルの1ピースにすぎません。この記事では、PHPを使って最も一般的な暗号化アルゴリズムを実装する方法を説明します。PHPデフォルトの暗号化機能に加えて、多様な暗号化ライブラリやパッケージの使用法を幅広く紹介していきます。
この記事のサンプルコードでは、textfile.txtという小さなテキストファイルを使用します。このファイルには次のようなプレーンテキストが含まれています。
For every difficult and complicated question there is an answer that is simple, easily understood, and wrong. H.L. Mencken
PHPデフォルトの暗号化関数
PHPには3つの暗号化関数、md5()
、crypt()
、sha1()
が用意されています。md5()
関数のプロトタイプは次のとおりです。
string md5(string $str [, bool $raw_output ])
この関数はMD5メッセージダイジェストアルゴリズムを使い、与えられた文字列のMD5ハッシュを計算します。$str
引数は、暗号化される文字列を表します。$raw_output
引数にFALSE
(デフォルト)を渡すと、関数は32文字の16進数を返します。TRUE
を渡すと、16バイトのバイナリ値そのものを返します。
PHPのcrypt()
関数は、一方向の暗号化を行う関数です。この関数を使用すると、入力したパスワードが、保存されている暗号化済みパスワードと一致するかどうかを簡単に確認できます(暗号化済みパスワードを復号する手間が省けます)。crypt()
関数のプロトタイプは次のとおりです。
string crypt (string $str [, string $salt ])
この関数は、UNIX標準のDESベースの暗号化アルゴリズム(または各システムで使用できる代替アルゴリズム)を使って、暗号化した文字列を返します。$str
引数は、暗号化される文字列です。オプションの$salt
引数は、暗号化のベースとなる文字列(ソルト)です。ソルト文字列を指定しない場合、PHPは関数呼び出しごとにランダムにソルト文字列を生成します。
PHPのsha1()
関数は、文字列のSHA-1ハッシュを計算します。sha1()
関数のプロトタイプは次のとおりです。
string sha1 (string $str [, bool $raw_output ])
この関数はSHA-1ハッシュを文字列として返します。繰り返しになりますが、$str
引数は入力文字列を表します。オプションの$raw_output
引数にTRUE
を設定すると、関数はバイナリ形式そのままのSHA-1ハッシュを20文字分の長さで返します。FALSE
を設定すると、16進数表記で40文字分を返します。
実際の例を見てみましょう。以下のコードは、PHPデフォルトの暗号化関数を使ってtextfile.txtの内容を暗号化し、その結果をencrypted.txtファイル(図1を参照)に出力する方法を示しています。
![図1 暗号化されたファイル。exrypted.txtファイルには、PHPデフォルト関数のmd5、crypt、sha1で暗号化したパスワードが入っています。 図1 暗号化されたファイル。exrypted.txtファイルには、PHPデフォルト関数のmd5、crypt、sha1で暗号化したパスワードが入っています。](http://cz-cdn.shoeisha.jp/static/images/article/2628/2628_01.gif)
<?php $file = 'textfile.txt'; $initial_contents = file_get_contents($file); if($initial_contents){ $password = 'OctaviaAnghel'; //Calculates the md5 hash $md5_data = md5($password); //This function encrypts data $crypt = crypt($password); //Calculate the sha1 hash $sha1 = sha1($password); $encrypted_file = @fopen('encrypted.txt','w'); $ok_encrypt = @fwrite($encrypted_file,'md5: '. $md5_data."\r\n".'crypt: '.$crypt."\r\n".'sha1: '.$sha1); if($ok_encrypt){ echo 'The encrypted code was succesfully created'. ' in encrypted_file.txt!!!'.' '; } else{ echo ("The write of this file failed!"); } @fclose($encrypted_file); } ?>
PHPはこれらのデフォルトの関数に加え、外部ライブラリおよびパッケージを介した暗号化にも対応しています。表1に、以降で述べるライブラリおよびパッケージを示します。
パッケージ/ライブラリ | 説明 |
MCrypt | 多様な暗号化関数が用意されており、大規模なファイルまたはデータストリームを暗号化するときに使用します。詳細についてはhttp://mcrypt.sourceforge.net/を参照してください。 |
MHash | ハッシュを取得するために使用します。MHashは、SHA、MD5、CRCなどの代表的なアルゴリズムと実装をサポートしています。これらのアルゴリズムを使用して、チェックサムの計算、メッセージダイジェストの作成、他の署名の作成を行うことができます。MHashはHTMLのパスワード欄に入力されたパスワードのハッシュを得る目的でよく使われます。詳細についてはhttp://mhash.sourceforge.net/を参照してください。 |
Crypt_Blowfish | 双方向での高速な暗号化のために、秘密鍵あり/なしの両方で用います。Crypt_Blowfishの利用にあたり、MCrypt PHP拡張機能は必要ありません。ただしMCryptがインストールされていれば使用できます。詳細についてはhttp://pear.php.net/package/Crypt_Blowfishを参照してください。 |
Crypt_RSA | RSAと同様の鍵生成、暗号化/復号、署名および署名確認を行います。詳細についてはhttp://pear.php.net/package/Crypt_RSAを参照してください。 |
Crypt_HMAC | RFC 2104に準拠したハッシュを算出します。詳細についてはhttp://pear.php.net/package/Crypt_HMACを参照してください。 |
Crypt_DiffieHellman | Diffie-Hellman鍵交換暗号化プロトコルをPHP5用に実装したパッケージです。詳細についてはhttp://pear.php.net/package/Crypt_DiffieHellmanを参照してください。 |