phpの暗号化関連のメソッドを試してみる
VirtualBoxにCentOSをとりあえずインストール
の続き
phpの暗号化関連の各種メソッドを試してみる。
暗号化関連のメソッドを試してみる
$ vi test.php
<?php $data = "dummy text"; $key = "secret key"; echo "md5:" . md5($data) . "\n"; echo "sha1:" . sha1($data) . "\n"; echo "hash_hmac(md5):" . hash_hmac("md5", $data, $key) . "\n"; echo "hash_hmac(sha1):" . hash_hmac("sha1", $data, $key) . "\n"; echo "gzipcompress:" . gzcompress($data) . "\n"; echo "base64_encode(gzipcompress):" . base64_encode(gzcompress($data)) . "\n"; $r16 = openssl_random_pseudo_bytes(16); $r8 = openssl_random_pseudo_bytes(8); echo "openssl_encrypt(aes128):" . openssl_encrypt($data, 'aes128', $key, false, $r16) . "\n"; echo "openssl_encrypt(aes256):" . openssl_encrypt($data, 'aes256', $key, false, $r16) . "\n"; echo "openssl_encrypt(des):" . openssl_encrypt($data, 'des', $key, false, $r8) . "\n"; echo "openssl_encrypt(des3):" . openssl_encrypt($data, 'des3', $key, false, $r8) . "\n";
実行した結果。
$ php test.php md5:7135d0df9da029ad9f541c570da69e8c sha1:f5d04899d2bbea2bacbf2227dc05bf70cffd78fe hash_hmac(md5):1735325eadf9fa663d055719f04c2bd1 hash_hmac(sha1):28be4bfbb20a7899aef91c08bc43598d4e4259d4 gzipcompress:x�K)�T(I�(K base64_encode(gzipcompress):eJxLKc3NrVQoSa0oAQAWSwQS openssl_encrypt(aes128):p4scFg9Q0x9UrVpUFqpF7Q== openssl_encrypt(aes256):V0aoqnLxyR0YEJl8ZyPZpA== openssl_encrypt(des):oH8P2fcpIEQK/DrwMtV5pA== openssl_encrypt(des3):UY8tvEhIBos+s7QbdWbtdQ==
圧縮率を見てみる
まずは、10KBと100KBのテキストファイルを生成する。
$ php -r '$s=range("a","z"); for($i=0;$i<10240;$i++) echo $s[array_rand($s)];' > 10kb.txt $ php -r '$s=range("a","z"); for($i=0;$i<102400;$i++) echo $s[array_rand($s)];' > 100kb.txt
$ ls -lh -rw-rw-r-- 1 hoge hoge 10K 1月 1 00:00 2014 10kb.txt -rw-rw-r-- 1 hoge hoge 100K 1月 1 00:00 2014 100kb.txt
中身は下記のような感じ
$ cat 10kb.txt sdjrsuakruzssqbqwjlipjikigskcvoxoixoowsaaubrztgyjcljegtpelvginozvsocoshxchd ckinkaxbyrjbyvsrzzxtsmgevachaocoxwmykxsffheicqqadbqicrluhbuqqayxtjdfawpvdtc hikdutdodpwakxmlnnzinugmubkrmrpkkhdlujvftsfvbmlomrlmbosglbzixyhluyroyhnvtgi ・・・ pmahmepjrmwixdcxnbxqeawvackxbzwtjxeekwudemajpywqsiyqjdtbgxwzzalvfxevneshuhu
下記のプログラムで圧縮レベルごとの圧縮後のサイズを見てみる。
<?php $data = file_get_contents("10kb.txt"); //$data = file_get_contents("100kb.txt"); echo "original = " . strlen($data) . "\n"; echo "level default = " . strlen(gzcompress($data)) . "\n"; echo "level 0 = " . strlen(gzcompress($data, 0)) . "\n"; echo "level 1 = " . strlen(gzcompress($data, 1)) . "\n"; echo "level 2 = " . strlen(gzcompress($data, 2)) . "\n"; echo "level 3 = " . strlen(gzcompress($data, 3)) . "\n"; echo "level 4 = " . strlen(gzcompress($data, 4)) . "\n"; echo "level 5 = " . strlen(gzcompress($data, 5)) . "\n"; echo "level 6 = " . strlen(gzcompress($data, 6)) . "\n"; echo "level 7 = " . strlen(gzcompress($data, 7)) . "\n"; echo "level 8 = " . strlen(gzcompress($data, 8)) . "\n"; echo "level 9 = " . strlen(gzcompress($data, 9)) . "\n";
10KBの場合
original = 10240 level default = 6402 level 0 = 10251 level 1 = 6552 level 2 = 6551 level 3 = 6551 level 4 = 6402 level 5 = 6402 level 6 = 6402 level 7 = 6402 level 8 = 6402 level 9 = 6402
100KBの場合
original = 102400 level default = 64995 level 0 = 102421 level 1 = 67562 level 2 = 67545 level 3 = 67543 level 4 = 64997 level 5 = 64995 level 6 = 64995 level 7 = 64995 level 8 = 64995 level 9 = 64995
あまり違いがはっきりしなかった。
各メソッドがどれくらいの重さか測ってみる。
下記のプログラムにて、for文の間で各メソッドを10万回呼び出して、
10KBと100KBのそれぞれで、どれくらい時間がかかったか計測してみる。
<?php foreach (array("10kb", "100kb") as $file) { $data = file_get_contents($file . ".txt"); $t = microtime(true); for ($i = 0; $i < 100000; $i++) { // //ここの部分で各メソッドを実行する // } echo $file . " " . number_format(microtime(true) - $t, 1) . "秒\n"; }
結果
md5($data);
の場合
10kb 2.0秒 100kb 20.0秒
sha1($data);
の場合
10kb 3.8秒 100kb 37.8秒
hash_hmac("md5", $data, "secret key");
の場合
10kb 2.1秒 100kb 19.8秒
hash_hmac("sha1", $data, "secret key");
の場合
10kb 4.0秒 100kb 38.3秒
gzcompress($data);
の場合
10kb 21.4秒 100kb 371.4秒
gzcompress($data, 1);
の場合
10kb 17.4秒 100kb 228.1秒
gzcompress($data, 9);
の場合
10kb 21.0秒 100kb 377.5秒
base64_encode(gzcompress($data));
の場合
10kb 22.2秒 100kb 380.5秒
$r16 = openssl_random_pseudo_bytes(16); openssl_encrypt($data, 'aes128', 'secret key', false, $r16);
の場合
10kb 5.1秒 100kb 47.9秒
$r16 = openssl_random_pseudo_bytes(16); openssl_encrypt($data, 'aes256', 'secret key', false, $r16);
の場合
10kb 6.5秒 100kb 62.0秒
$r8 = openssl_random_pseudo_bytes(8); openssl_encrypt($data, 'des', 'secret key', false, $r8);
の場合
10kb 19.3秒 100kb 195.9秒
$r8 = openssl_random_pseudo_bytes(8); openssl_encrypt($data, 'des3', 'secret key', false, $r8);
の場合
10kb 52.9秒 100kb 545.3秒