I came across a blog post titled "PBKDF2: performance matters" where the author discusses how most implementations of PBKDF2 are slower than it otherwise could be.
After reading the blog post, I decided to write some Python bindings to
see how much of a performance increase I can obtain over the standard library's
hashlib.pbkdf2_hmac
implementation. My goal is a library with an interface
that is compatible with hashlib.pbkdf2_hmac
.
The results are surprisingly good. With a basic benchmarking script on CPython 3.4.1, my implementation is about 3 times as fast as the standard library.
$ ./bench.sh
Benchmark hashlib...
100 loops, best of 3: 60.2 msec per loop
Benchmark fastpbkdf2...
100 loops, best of 3: 20.3 msec per loop
With PyPy 2.6.0, the results are even better.
$ ./bench.sh
Benchmark hashlib...
100 loops, best of 3: 242 msec per loop
Benchmark fastpbkdf2...
100 loops, best of 3: 19.2 msec per loop
I have since release my library as a PyPI package and the code is available on GitHub.
Simply install the package with pip
,
pip install fastpbkdf2
and import the function
from fastpbkdf2 import pbkdf2_hmac
The interface is exactly the same as hashlib.pbkdf2_hmac
and should be a
drop-in replacement.