Idea about authentication

242 views
Skip to first unread message

Ram Rachum

unread,
Sep 15, 2013, 5:00:31 AM9/15/13
to django-d...@googlegroups.com
Hi guys,

I just saw the new release announcement and I had an idea.

What if, in addition to sorting the hard to compute hash for every password, we will also store the sha 1 hash of the first 5 characters ofthe password's sha1 hash? Wouldn't this allow us to quickly rule out 99% of passwords, thereby defending against dos attacks, while atthe same time not letting an attacker who obtained the hashes to get the passwords?

I'm not a security expert, just brainstorming.

Thanks,
Ram.

Curtis Maloney

unread,
Sep 15, 2013, 5:25:32 AM9/15/13
to django-d...@googlegroups.com
Actually, you'd just speed up their attack, since most failed attempts would be quicker than others.

If you look in the crypto utils, you'll see a "constant time compare" ... this is a common thing in crypto circles to avoid leaking "how close" the guess was by how quickly the mismatch was found.

This is a class of "side channel attach"... worth reading up on if you want to get further into crypto: http://en.wikipedia.org/wiki/Side_channel_attack

--
Curtis




--
You received this message because you are subscribed to the Google Groups "Django developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-develop...@googlegroups.com.
To post to this group, send email to django-d...@googlegroups.com.
Visit this group at http://groups.google.com/group/django-developers.
For more options, visit https://groups.google.com/groups/opt_out.

Ram Rachum

unread,
Sep 15, 2013, 5:45:29 AM9/15/13
to django-d...@googlegroups.com
Thanks Curtis!

I thought about my idea and realized it makes a brute-force attack easier, and we'd have to make the hashing stronger to compensate... Making the computation time longer for the real users logging in... So yeah, it won't help.

But then I had another idea. So PBKDF2 takes a longer time to calculate for longer passwords. Maybe the solution is to fix that? That would be more elegant than limiting passwords to 4096 (because then dos attackers can still attack using 4096-long passwords, and while not as slow as megabytes-long password, it's still slow.)

What if instead of calculating the PBKDF2 hash of the password, we'll calculate the PBKDF2 hash of its SHA1 hash? Then the time of checking passwords wouldn't depend on their length, and we wouldn't even have to place a limit of 4096 characters on passwords-- An attacker could try a 1MB-long password but it would slow us down the same amount as trying "123456" would. 

What do you think? 

Florian Apolloner

unread,
Sep 15, 2013, 6:12:31 AM9/15/13
to django-d...@googlegroups.com


On Sunday, September 15, 2013 11:45:29 AM UTC+2, Ram Rachum wrote:
What if instead of calculating the PBKDF2 hash of the password, we'll calculate the PBKDF2 hash of its SHA1 hash? Then the time of checking passwords wouldn't depend on their length, and we wouldn't even have to place a limit of 4096 characters on passwords-- An attacker could try a 1MB-long password but it would slow us down the same amount as trying "123456" would. 

PBKDF2 takes long by design… A better long term solution would be to rate limit password attempts…

Ram Rachum

unread,
Sep 15, 2013, 6:34:03 AM9/15/13
to django-d...@googlegroups.com
Florian, I'm not sure that you read my message carefully enough. I'm not proposing to reduce the time that PBKDF2 takes to hash. I'm proposing to keep that time just as long, but make it independent on the password length.

Donald Stufft

unread,
Sep 15, 2013, 8:28:18 AM9/15/13
to django-d...@googlegroups.com
We'd want to use SHA256 but that's an OK thing to do AFAIK. I wouldn't agree to it in a security patch because it breaks backwards compatibility in a much larger way than the patch we did does.

In fact we already do this with the bcrypt hasher in Django 1.6+ to solve a password truncation issue (Bcrypt truncates the input password before hashing it).



-----------------
Donald Stufft
PGP: 0x6E3CBCE93372DCFA // 7C6B 7C5D 5E2B 6356 A926 F04F 6E3C BCE9 3372 DCFA

signature.asc

Florian Apolloner

unread,
Sep 15, 2013, 2:59:32 PM9/15/13
to django-d...@googlegroups.com
Hi Ram,


On Sunday, September 15, 2013 12:34:03 PM UTC+2, Ram Rachum wrote:
Florian, I'm not sure that you read my message carefully enough. I'm not proposing to reduce the time that PBKDF2  takes to hash.

By replacing the password with a hash before running it through PBKDF2 you are reducing that time for every password longer than the hash… And given the way PBKDF2 works you'll reduce it by quite a bit (note that all of this only applies to passwords longer than the hash, so it's probably pretty academical). Either way, we'd at least need a new hasher class since it would be backwards incompatible. Independent of that we'd have to evaluate if pre-hashing the password could make  PBKDF2 less secure (probably not to likely, but who knows).

Florian

Donald Stufft

unread,
Sep 15, 2013, 3:09:55 PM9/15/13
to django-d...@googlegroups.com
According to Thomas Porin in the context of bcrypt pre-hashing the password is fine (and we already do this in Django 1.6). I see no reason the same wouldn't hold true for PBKDF2.
signature.asc

Ram Rachum

unread,
Sep 15, 2013, 4:27:16 PM9/15/13
to django-d...@googlegroups.com

Florian Apolloner

unread,
Sep 16, 2013, 1:57:27 AM9/16/13
to django-d...@googlegroups.com
Hi,

there are a few things which worry me about this patch (aside from the note from charettes). You write "and the DoS attack vector is avoided" which is not true, hashing functions are by design CPU-intensive so you are not avoiding DoS, even if hashing now consistently takes less (for short passwords more) time you still can DoS a site. Avoiding the DoS vector in this case would mean something like rate limiting… And curious, why are you not able to run the tests, it's as simple as "cd tests; ./runtests". No offense, but copying those few lines and adding a broken test isn't really helping that much…

I am also not sure if we would want to use this as default hasher at all, the current default isn't that bad and puts a limit onto the hashing like yours does (granted, a bit later timewise, but as I said before changing the hash function is not a longterm solution).

Cheers,
Florian

Ram Rachum

unread,
Oct 3, 2013, 3:56:14 AM10/3/13
to django-developers
Hi everybody,

I've submitted the patch, and corrected it, and it's been sitting on the issue tracker for 2 weeks without anyone commenting. Does anyone care to discuss this? I want to have this merged in, or discuss any problems in merging it in. 


--
You received this message because you are subscribed to a topic in the Google Groups "Django developers" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/django-developers/iuSE5Y4R3hg/unsubscribe.
To unsubscribe from this group and all its topics, send an email to django-develop...@googlegroups.com.

Florian Apolloner

unread,
Oct 3, 2013, 5:54:49 AM10/3/13
to django-d...@googlegroups.com
We already committed a fix for pbkdf2, the DOS vector no longer exists (at least not in this form): https://github.com/django/django/commit/68540fe4df44492571bc610a0a043d3d02b3d320
Reply all
Reply to author
Forward
0 new messages