CodeIgniter ユーザガイド 日本語版 Version 1.7.3


暗号化クラス

暗号化クラスでは、2-wayのデータ暗号化が提供されています。これは、メッセージの排他的ビット和 (bitwise XOR) をランダムにハッシュ計算して符号化する方式を使ってメッセージをプリコンパイルし、その後、Mcryptライブラリを使って暗号化する方式を使います。Mcrypt がサーバで有効になっていない場合、符号化されたメッセージは、 セッションの暗号化などの "気軽な" 目的には適合する度合いのセキュリティになります。Mcryptが有効な場合は、非常に高いレベルのセキュリティの2重暗号化されたメッセージの文字列を有効に利用できます。

キーの設定

キー は、暗号化処理をコントロールし、暗号化された文字列を復号できる小さな情報です。実際には、選んだキーは、そのキーで暗号化されたデータを復号する唯一の手段になります。ですので、注意してキーを選ぶだけでなく、保存用データに使用するつもりなら、キーは決して変更してはいけません。

言うまでもなく、キーは厳重に保管されるべきです。誰かがキーを取得できてしまえば、データは簡単に復号されてしまいます。サーバが完全に管理できない場合は、クレジットカード番号を保管する場合などの高いセキュリティが必要とされるものに暗号化を適用する場合は、常に、キーの安全性を注意して考えるのを忘れないでください。

暗号アルゴリズムを最大限利用するには、キーは32文字の長さ(128ビット)にする必要があります。キーは、大文字小文字や数字をできる限りランダムに混合させる必要があります。キーは単純な文字列にしてはいけません。暗号化を安全にするためには、可能な限りランダムにする必要があります。

キーはapplication/config/config.php の中に保存するか、あるいは、独自の保存方法を設計して、暗号化/復号化のときに動的にキーを渡すかのどちらかになります。

キーをapplication/config/config.php に保存するには、ファイルを開き、下記のようにセットします:

$config['encryption_key'] = "あなたのキー";

メッセージの長さ

暗号化メソッドで生成されたメッセージは元のメッセージより約2.6倍長くなるということを知っておくのは重要です。たとえば、21文字の "my super secret data" という文字列を暗号化した場合は、暗号化された文字列は、およそ55文字になります (暗号化された文字列は、64 ビットのクラスタごとに長さが増加し、正確にはリニアに増加しないので、「およそ」になります)。データの保管方式を選ぶ際に、このことを考慮するようにしてください。たとえば、クッキーは4KBのデータしか保持できません。

クラスの初期化

CodeIgniterの大部分のクラスと同じく、暗号化クラスは、コントローラの中で $this->load->library メソッドを使用することで初期化できます:

$this->load->library('encrypt');

いったん読み込まれると、暗号化ライブラリオブジェクトは、次のようにして利用可能です: $this->encrypt

$this->encrypt->encode()

データを暗号化し、文字列として返します。例:

$msg = 'My secret message';

$encrypted_string = $this->encrypt->encode($msg);

設定ファイルに指定してあるキーを使用したくない場合は、オプションで、第2引数に暗号化キーを指定することができます:

$msg = '秘密のメッセージ';
$key = '最高機密のキー';

$encrypted_string = $this->encrypt->encode($msg, $key);

$this->encrypt->decode()

暗号化された文字列を復号します。例:

$encrypted_string = 'APANtByIGI1BpVXZTJgcsAG8GZl8pdwwa84';

$plaintext_string = $this->encrypt->decode($encrypted_string);

$this->encrypt->set_cipher();

Mcryptの暗号アルゴリズムをセットできます。デフォルトでは、MCRYPT_RIJNDAEL_256 を使用します。例:

$this->encrypt->set_cipher(MCRYPT_BLOWFISH);

利用できる暗号アルゴリズムのリストを見るには、php.netを訪問してください。

サーバでMcryptがサポートされているかどうかを手動でテストしたい場合は、以下のようにします:

echo ( ! function_exists('mcrypt_encrypt')) ? 'NG' : 'OK';

$this->encrypt->set_mode();

Mcryptのブロック暗号モードをセットできます。デフォルトでは、MCRYPT_MODE_ECB を使います。例:

$this->encrypt->set_mode(MCRYPT_MODE_CFB);

利用できるモードの一覧を見るには php.net を訪問してください。

$this->encrypt->sha1();

SHA1エンコードメソッド。文字列を渡すと160ビットの一方向ハッシュを返します。Note: SHA1はちょうどMD5のように、復号できません。例:

$hash = $this->encrypt->sha1('何かの文字列');

多くのPHP環境では、SHA1がデフォルトでサポートされていますので、単にエンコードすればよいだけであれば、組み込みの関数を利用すれば単純になります:

$hash = sha1('何かの文字列');

もしサーバがSHA1をサポートしていなければ、このクラスのメソッドを使用できます。