diff options
| author | Florian Apolloner <florian@apolloner.eu> | 2013-09-17 22:59:56 +0200 |
|---|---|---|
| committer | Florian Apolloner <florian@apolloner.eu> | 2013-09-24 21:14:30 +0200 |
| commit | f3853172a4bde963ff9908870bc2ea53eb73bc04 (patch) | |
| tree | a007c0c0fda58f83144f6c16e2840f0632fd1dd1 | |
| parent | 1cc572a071003583f15cdbca2f5b4d910ebd3504 (diff) | |
[1.5.x] Fixed #21138 -- Increased the performance of our PBKDF2 implementation.
Thanks go to Michael Gebetsroither for pointing out this issue and help on
the patch.
Backport of 68540fe4df44492571bc610a0a043d3d02b3d320 from master.
| -rw-r--r-- | django/utils/crypto.py | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/django/utils/crypto.py b/django/utils/crypto.py index 94f717bb17..a01272b60f 100644 --- a/django/utils/crypto.py +++ b/django/utils/crypto.py @@ -122,9 +122,8 @@ def _fast_hmac(key, msg, digest): This function operates on bytes. """ dig1, dig2 = digest(), digest() - if len(key) > dig1.block_size: - key = digest(key).digest() - key += b'\x00' * (dig1.block_size - len(key)) + if len(key) != dig1.block_size: + raise ValueError('Key size needs to match the block_size of the digest.') dig1.update(key.translate(_trans_36)) dig1.update(msg) dig2.update(key.translate(_trans_5c)) @@ -159,6 +158,11 @@ def pbkdf2(password, salt, iterations, dklen=0, digest=None): hex_format_string = "%%0%ix" % (hlen * 2) + inner_digest_size = digest().block_size + if len(password) > inner_digest_size: + password = digest(password).digest() + password += b'\x00' * (inner_digest_size - len(password)) + def F(i): def U(): u = salt + struct.pack(b'>I', i) |
