mcrypt_generic を使ってたのだけど、とあるレンタルサーバーで mcrypt が使えない。。。
なので PEAR::Crypt_Blowfish を使った暗号化に切り替え。
こっちのが簡単だったら笑う。
『mcrypt_generic』
(PHP 4 >= 4.0.2, PHP 5)
『PEAR::Crypt_Blowfish』
PHP 4.2.0
処理の流れ
使い方は mcrypt_generic とほぼ同じ。
1, 付加する文字列(salt)を作成する
2, 初期化ベクトル(iv)を作成する
2, 使用するアルゴリズムを指定してインスタンスを作成する
3, 【3】を使用してデータを暗号化する
4, 暗号化された文字列を base64 でエンコードする
mcrypt_generic_init → Crypt_Blowfish::factory
mcrypt_generic → $blowfish->encrypt($blowfish->decrypt)てな感じ。
mcrypt_module_open と mcrypt_generic_deinit、mcrypt_module_close の必要がない。
あ、簡単や。。。
ちなみにコードは↓こんな感じ。
暗号化
$salt = substr(md5($salt), 0, 8);
$iv = substr(md5($salt), 0, 8);
$blowfish = Crypt_Blowfish::factory("cbc", $salt, $iv);
$encrypted_data = $blowfish->encrypt($data);
return base64_encode($encrypted_data);
}
encryptedData(base64_encode($password), $salt);
$password は入力したパスワード
$salt はランダム文字列
複号
$salt = substr(md5($salt), 0, 8);
$iv = substr(md5($salt), 0, 8);
$blowfish = Crypt_Blowfish::factory('cbc', $salt, $iv);
$decrypted_data = $blowfish->decrypt($data);
$decrypted_data = rtrim($decrypted_data, "¥0");
return base64_decode($decrypted_data);
}
decryptedData(base64_encode($password), $salt);
$password は入力したパスワード
$salt はパスワードと関連付けて保存しておいた文字列
おまけ
今回の $salt のようにランダムな文字列を生成したい場合がよくある。
なので以下のようなコードを書いた。
for($i = 0x31; $i <= 0x39; $i++) {
//1〜9
$char[] = chr($i);
}
for($i = 0x41; $i <= 0x5a; $i++){
// アルファベット大文字
if(!in_array($i,array(0x49, 0x4c, 0x4f))) {
// I,L,Oをのぞく
$char[] = chr($i);
}
}
for($i = 0x61; $i <= 0x7a; $i++) {
// アルファベット小文字
if(!in_array($i,array(0x69,0x6c,0x6f))) {
// i,l,oをのぞく
$char[] = chr($i);
}
}
$salt = "";
for($i = 0; $i < $length; $i++) {
// $length桁の文字列を生成
$randam = mt_rand(0, count[$char]);
$salt .= $char[$randam];
}
}
$length に桁数を指定すればその桁数でランダム文字列が生成される。
パスワード作るのに便利。