urlのパラメータを暗号化してみようとして、思わぬところで躓く。
下記は PHP 可逆暗号化 等で検索したら一番上に出てくるの暗号化方法
しかし、そのまま使うと・・・
暗号化
function encryptedParam($input,$key = KEY_DEFAULT)
$key = md5($key);
//暗号化モジュール使用開始
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$key = substr($key, 0, mcrypt_enc_get_key_size($td));
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
if (mcrypt_generic_init($td, $key, $iv) < 0) {
exit('error.');
}
$encrypted_data = base64_encode(mcrypt_generic($td, $input));
//print $encrypted_data;
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $encrypted_data;
}
複合化
function decryptedParam($input,$key = KEY_DEFAULT)
{
//暗号化&復号化キー
$key = md5($key);
//暗号化モジュール使用開始
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$key = substr($key, 0, mcrypt_enc_get_key_size($td));
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
//暗号化モジュール初期化
if (mcrypt_generic_init($td, $key, $iv) < 0) {
exit('error.');
}
//データを復号化
$encrypted_data = mdecrypt_generic($td, base64_decode($input));
//暗号化モジュール使用終了
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $encrypted_data;
}
下記の文字列を上記のモジュールで暗号化→複合化をしてみる(自分で実際に使った文字列)
そのまま暗号化→複合化
$a = '3'
$key = '[適当なキー]';
$a = encryptedParam($a,$key )
$a = decryptedParam($a,$key )
if($a == 3) true;
if($a == '3') false;
なるほど数値型で入ってるんだな。
ん・・・?phpの==で細かい型判定あったっけ・・・?
is_numeric($a) false
なん・・だと・・?
if($a === 3) false
???
bin2hex($a) 3300000000
bin2hex(3) 33
等など色々試してみたのですが、原因はこのモジュールを使った場合にNULL文字が末尾に入るということでした。
なので
複合化の最後の行
$encrypted_data = mdecrypt_generic($td, base64_decode($input));
の部分を
複合化の最後の行
$encrypted_data = rtrim(mdecrypt_generic($td, base64_decode($input)));
でrtrimしてあげるという方法を取り解決しました。
ちなみに上記のようにわかる場合もあれば、比較してもそのまま上手くいってしまう文字列もあるのが余計にわかりにくい。
ネットで簡単にやり方が調べられる時代とはいえ、ちゃんと自分で試してみないとわからないもんだなーと思いました(小並感)。