|Idea about authentication||Ram Rachum||9/15/13 2:00 AM|
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.
|Re: Idea about authentication||Curtis Maloney||9/15/13 2:25 AM|
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
|Re: Idea about authentication||Ram Rachum||9/15/13 2:45 AM|
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?
|Re: Idea about authentication||Florian Apolloner||9/15/13 3:12 AM|
PBKDF2 takes long by design… A better long term solution would be to rate limit password attempts…
|Re: Idea about authentication||Ram Rachum||9/15/13 3:34 AM|
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.
|Re: Idea about authentication||Donald Stufft||9/15/13 5:28 AM|
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).
PGP: 0x6E3CBCE93372DCFA // 7C6B 7C5D 5E2B 6356 A926 F04F 6E3C BCE9 3372 DCFA
|Re: Idea about authentication||Florian Apolloner||9/15/13 11:59 AM|
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).
|Re: Idea about authentication||Donald Stufft||9/15/13 12:09 PM|
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.
|Re: Idea about authentication||Ram Rachum||9/15/13 1:27 PM|
|Re: Idea about authentication||Florian Apolloner||9/15/13 10:57 PM|
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).
|Re: Idea about authentication||Ram Rachum||10/3/13 12:56 AM|
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.
|Re: Idea about authentication||Florian Apolloner||10/3/13 2:54 AM|
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