続・mcryptを使って見る。
やってることは公式のサンプルのまんまだったりするけどとりあえず関数化してみた。
コード
<?php // 秘密鍵 define( "EFFECTIVE_KEY", "sercret_key" ); /** * 認証キー作成 * * @param String $input * @return String 暗号文 */ function encodeKey( $input ) { $input = $input; $td = mcrypt_module_open( MCRYPT_TRIPLEDES, '', MCRYPT_MODE_ECB, ''); srand(); $iv = mcrypt_create_iv( mcrypt_enc_get_iv_size( $td), MCRYPT_RAND); $key = substr( md5( EFFECTIVE_KEY ), 0, mcrypt_enc_get_key_size( $td)); mcrypt_generic_init( $td, $key, $iv); $encrypted = mcrypt_generic( $td, $input); mcrypt_generic_deinit( $td); mcrypt_module_close( $td); $encoded = base64_encode( $encrypted); // スラッシュが入ってくるので"_"に変換しておく(url引数に与える場合への対処) $encoded = preg_replace("/\//","_", $encoded); return $encoded; } /** * 認証キーより複合化 * * @param String $parameter * @return String 復号した値 */ function decodeKey( $parameter) { $encrypted = preg_replace( "/_/", "/", $parameter ); $encrypted = base64_decode( $encrypted); $td = mcrypt_module_open( MCRYPT_TRIPLEDES, '', MCRYPT_MODE_ECB, ''); srand(); $iv = mcrypt_create_iv( mcrypt_enc_get_iv_size( $td), MCRYPT_RAND); $key = substr( md5( EFFECTIVE_KEY ), 0, mcrypt_enc_get_key_size( $td)); mcrypt_generic_init( $td, $key, $iv); $decrypted = mdecrypt_generic( $td, $encrypted ); mcrypt_generic_deinit( $td); mcrypt_module_close( $td); return rtrim( $decrypted); } // 使って見る $input_data = "auth_data"; echo $input_data ."<br/>"; $encrypted_data = encodeKey( $input_data); echo $encrypted_data ."<br/>"; $decrypted = decodeKey( $encrypted_data); echo $decrypted ."<br/>";
出力結果
auth_data VGQ8Dn_4qUbz1gPyH0Hugg== auth_data
蛇足
- ポイント
- なんだかんだ、エンコードしたほうが使いやすい
- ⇒ 暗号文をブラウザで確認しようとするとひどいことになる。
- "/"が入ってくる
- ⇒ クエリストリングに乗せる場合もあるだろうし出現しない"_"に置き換えてみた
- 複合化した後に、文字列の右側に無駄なものが入ってくるの
- ⇒ rtrimで消えるらしい
- なんだかんだ、エンコードしたほうが使いやすい
実際は生成時間とか持っておいて複合するときに有効期限チェックとかやるといいかも