SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

PHP暗号化ガイド

デフォルト関数と外部ライブラリを利用した暗号化

  • このエントリーをはてなブックマークに追加

このガイドでは、PHPアプリケーションのセキュリティ強化に使用できる各種暗号化パッケージの入手先と、インストール方法および使用方法を総合的に取り上げます。

  • このエントリーをはてなブックマークに追加

はじめに

 理想的な世の中では、「暗号化」や「セキュリティ」といった言葉は存在すらしないでしょう。しかし現実の世界は完全とはほど遠いものです。ですから、ソフトウェア開発者はアプリケーションのセキュリティ対策に相応の時間をかけなければなりません。暗号化は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で暗号化したパスワードが入っています。
<?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に、以降で述べるライブラリおよびパッケージを示します。

表1 PHPでの暗号化と復号に使われるパッケージおよびライブラリ
パッケージ/ライブラリ説明
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_RSARSAと同様の鍵生成、暗号化/復号、署名および署名確認を行います。詳細についてはhttp://pear.php.net/package/Crypt_RSAを参照してください。
Crypt_HMACRFC 2104に準拠したハッシュを算出します。詳細についてはhttp://pear.php.net/package/Crypt_HMACを参照してください。
Crypt_DiffieHellmanDiffie-Hellman鍵交換暗号化プロトコルをPHP5用に実装したパッケージです。詳細についてはhttp://pear.php.net/package/Crypt_DiffieHellmanを参照してください。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
MCryptを用いた大規模データの暗号化

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Octavia Andreea Anghel(Octavia Andreea Anghel)

経験豊富なPHP開発者。現在は、国内外のソフトウェア開発コンテストに参加するプログラミングチームの主任トレーナーを務める。国レベルの教育プロジェクト開発のコンサルティングも担当している。共著書に『XML technologies?XML in Java』があり、XML部分の執筆を担当。PHPやXML...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2628 2008/06/30 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング