HELLO, I’M SERHAT AND THIS IS MY FANCY TITLE.

Şifreleme algoritmaları için benchmark

Veritabanında plain-text olarak veri tutmak tehlikelidir, bu yüzden verilerimizi MD5 veya SHA gibi şifreleme yöntemleri ile şifrelememiz gerekebilir. Bu aşamada seçeceğimiz şifreleme metoduna karar vermek açısından bir performans testi yapmak gerektiğini düşündüm.

Öncelikle şu sayfayı güzelce bir inceleyin, elimizin altında bulunsun: https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html

Elinizdeki stringin, çeşitli kriptolama yöntemlerinde ortaya çıkarttığı hash hakkında bir ön görüşünüz olması için hazırladığım 'hash_generator' isimli ufak betiği de inceleyebilirsiniz. Bu betiğin kaynak kodu da Gist olarak bulunuyor.

Hazırsanız ufak bir kaç benchmark testi yapalım. Bunun için aşağıdaki uygulamayı kullanabilirsiniz;

<?php

define('HASH_TIMES', 1000);
define('HASH_DATA', 'The quick brown fox jumped over!'); // 32 bytes

header('Content-Type: text/plain');
echo 'Testing ' . strlen(HASH_DATA) . ' bytes of data over ' . HASH_TIMES . " iterations:\n";

foreach (hash_algos() as $algo) {
  $time = microtime(1);
  for ($i = 0; $i < HASH_TIMES; $i++) hash($algo, HASH_DATA);
  $results[$algo] = microtime(1) - $time;
}

$time = microtime(1); for ($i = 0; $i < HASH_TIMES; $i++) crc32(HASH_DATA); $results['crc32()'] = microtime(1) - $time;
$time = microtime(1); for ($i = 0; $i < HASH_TIMES; $i++) md5(HASH_DATA); $results['md5()'] = microtime(1) - $time;
$time = microtime(1); for ($i = 0; $i < HASH_TIMES; $i++) sha1(HASH_DATA); $results['sha1()'] = microtime(1) - $time;

asort($results, SORT_NUMERIC);
foreach ($results as $algo => $time) echo "\n$time\t$algo";

?>

Bu testten alacağımız sonuçlara göre en hızlı çalışan ve en yavaş çalışan metodları göreceğiz. Dolayısıyla hangi şifreleme algoritmasını kullanacağımıza karar vermemizde önemli bir rol oynayan performans etkenini kafamızda netleştireceğiz. Yukarıdaki test 32 byte'lık veri için, 1000 kez tekrarlanmıştır.

0.00058913230895996 crc32()
0.0009300708770752  md5()
0.0010159015655518  crc32
0.0010371208190918  crc32b
0.0010850429534912  sha1()
0.0011179447174072  md5
0.001121997833252   md4
0.0013129711151123  sha1
0.0013148784637451  adler32
0.0015969276428223  salsa20
0.0016100406646729  tiger128,3
0.0016219615936279  tiger192,3
0.001629114151001   salsa10
0.001716136932373   tiger160,3
0.0017518997192383  tiger128,4
0.0017580986022949  tiger192,4
0.0017728805541992  tiger160,4
0.001849889755249   ripemd128
0.0019888877868652  sha256
0.0020010471343994  sha224
0.0020439624786377  ripemd320
0.0020489692687988  haval128,3
0.0020759105682373  haval192,3
0.0020990371704102  haval224,3
0.0021038055419922  haval160,3
0.0021359920501709  haval256,3
0.0022099018096924  ripemd256
0.0023119449615479  haval128,4
0.002345085144043   haval160,4
0.0023760795593262  haval192,4
0.002439022064209   haval256,4
0.0025219917297363  haval160,5
0.0025811195373535  haval128,5
0.0026021003723145  haval192,5
0.0026168823242188  haval224,5
0.0026481151580811  haval256,5
0.0026988983154297  ripemd160
0.0028259754180908  haval224,4
0.0033509731292725  gost
0.0042660236358643  snefru
0.0042967796325684  snefru256
0.0048680305480957  sha384
0.0053589344024658  sha512
0.0060269832611084  whirlpool
0.050267934799194   md2

Sonuçlara göre md2-whirlpool-sha512 ve sha384 hala en yavaş çalışan şifreleme metodları olarak görünüyor. En popüler yöntemlere göz atacak olursak MD5 en hızlı olarak değerlendirebileceğimiz ikinci sırada ve SHA1 ise beşinci sırada yerini alıyor.

MD5 ve SHA1 algoritmaları uzun zaman önce çözüldü, 512 bitlik (64byte) ve 384 bitlik SHA algoritması ise hala çözülebilmiş değil.

Whirlpool algoritmasını da son zamanlarda oldukça duymaya başladık. AES tabanında geliştirilen bu algoritma tahtını kimseye bırakmıyor ancak kullanışlılık yönünden puanı oldukça düşük. Performans yönünden bu denli zayıf olması web uygulamaları altında kullanımı önünde büyük bir engel, bu durum ise popülerliğini düşürüyor. Yine de tabi ki tercihler ihtiyaca göre şekillenecektir.

Başarılar.


Share this post!


Blog Comments powered by Disqus.