暗号化復号化の高速化
RailsアプリでCSV出力を実装していたのだが、これがどうも遅い。調査しているうちに復号化処理部分であることがわかった。わかったものの高速化の手段がわからなかったためQA@ITで質問してみた。
質問サイトへの投稿は始めてだったのでドキドキだったが、特に怒られることもなく、親切に教えて頂いた。その中で、暗号化復号化の鍵生成部分が重いのでは?との指摘があった。
このようなメソッドを3万回呼ぶと、3万回鍵生成が呼ばれてしまいます。鍵生成は中でハッシュを何千回も行なっていたりするので、3万回も呼ぶと、数千万回ハッシュを行なってしまい、不必要に重いかもと思います。パスワード(およびそれから生成される鍵)がつねに同一だとすると、1回でよいはずです。
http://qa.atmarkit.co.jp/q/2787
たしかに。。
PJで使用している暗号化復号化処理は昔誰かが書いたものを使いまわしていたので、特にその処理を深堀りしていなかったのである。
鍵は固定なので使いまわすことが出来る。ということで教えて頂いた方法を試そうと思ったのだが、Rubyが1.8.6のため、pbkdf2_hmac_sha1メソッドは無いと怒られた。
しょうがないので、単純に鍵生成まで完了したオブジェクトを使いまわす方法で実装してみた。
これを5万件の名前リストで実行してみた結果が下記である。
iMac-y-koh@yoonchulkoh:test $ time ruby encrypt_test.rb encrypt name_list_50000.txt real 0m53.752s user 0m53.653s sys 0m0.033s iMac-y-koh@yoonchulkoh:test $ time ruby encrypt_test.rb encrypt_shared name_list_50000.txt real 0m0.228s user 0m0.214s sys 0m0.013s iMac-y-koh@yoonchulkoh:test $ time ruby encrypt_test.rb decrypt name_list_50000_encrypted.txt real 0m53.159s user 0m53.141s sys 0m0.018s iMac-y-koh@yoonchulkoh:test $ time ruby encrypt_test.rb decrypt_shared name_list_50000_encrypted.txt real 0m0.273s user 0m0.259s sys 0m0.013s
53.752s/0.228s≒235倍
53.159s/0.273s≒194倍
いやはや爆速である。