How I became a password cracker
arstechnica.com
arstechnica.com
*I took my keys from in the house so... by ars standard that's serious theft.
Rather than reading that article might I suggest having a gander at moxie's https://www.cloudcracker.com and read his blog too for all the goodies.
Yeah, it's shameful that such a poorly written article is being touted as a "feature story." Then again that's what happens when your editor-in-chief demands articles of a certain length and you don't have much to say, so you fill three pages with bullshit. Kind of like in college!
When the user signs up, store a Timestamp for creation date, then take their email address and use it as a prefix and suffix to salt the password, for instance:
If the users password is shanelja, then the routine would be as such:
TIMESTAMPshaneljaEMAIL
or in my case:
147182994718shaneljashanea93@hotmail.co.uk
This produces a ridiculously hard password to brute force.
While this may be easy to compute if you know the rule, the general rule of thumb is that if your server has been attacked in such a way that the attacker has a copy of your database, they will most likely know the rule in any case, so it makes sense to have a good one.
Outside of this, no one should be using MD5 in this day and age, I would even recommend against Sha256 and other variants in that family, though I have a lot of respect for Blowfish, etc.
[1] http://codahale.com/how-to-safely-store-a-password/ [2] http://www.tarsnap.com/scrypt.html
I do.
> bcrypt is an adaptive password hashing algorithm
Just encrypt a common known plaintext string and use the password as the encryption key. This is exactly how various hashing schemes like UNIX's crypt() (based on DES) work.
Knowing the plaintext (e.g. a set of NUL bytes) is useless as long as the encryption scheme doesn't have a weakness against known-plaintext attacks [EDIT] that allow you to recover the encryption key somehow.
crypt(1) should be an example of how not to do hashing.
I feel like such a pedantic dick for harping on this, but the distinction is worth making.
[1] http://www.unlimitednovelty.com/2012/03/dont-use-bcrypt.html
The other algorithms he mentioned were "scrypt" (mentioned already by GP) and "pbkdf2"[1]. The algorithms really just lie on a line between "well studied" and "theoretical security" with bcrypt in the middle. With the author dismissing bcrypt because its worse than each of the others in one attribute ignoring that it's better than the other in that attribute. Also ignoring that bcrypt libraries are generally more popular and hence more reviewed.
The real point was not inventing your own salting / hashing algorithm.
It's trivial to build a lookup table like with md5, it just takes longer.
Salting is essential. I don't know why the parent was downvoted (probably because his salt is predictable?) so good salting is needed.
Example: WPA2 uses the SSID as the salt and PBKDF2 to derive the encryption key.
> It's trivial to build a lookup table like with md5, it just takes longer.
No, that's not true, because each one is initialized with a completely different public salt. You can't generate lookup tables for it, without covering the entire hash space.
Of course there is. As you said, it's an inherent part of the algorithm. But never put it beyond some people to use a trivial salt (or use the same one for all users)
"because each one is initialized with a completely different public salt"
If they follow the proper procedures, yes, building a lookup table is impossible.
You don't set the salt yourself, the library generates it from from a secure RNG.
For someone that's not that into security, it's easy to use and hard to get wrong.
Checking the python libraries they make it really easy to use, but you can provide your own salt if you want (you have to manually call 'gensalt' as well)
So pretty safe if you copy their examples.
The only redeeming factor I suppose would be that you have to store your random string somewhere anyway, at least this method required code traversal rather than just an SQL field named "password_salt".
What I do similar is,
Pw_hash = hash('f4/$$er3@' + salt + plain_text_pw);
If the attacker only gets the database (which has the hash and the salt) and not the source code they don't have the 'f4/$$er3@' value needed to perform any attacks
Your approach offers effectively zero additional security; it is trying to add "features" to salting that don't work towards their actual purpose.
Edit: If you want to have something site-wide that an attacker wouldn't have while decrypting an offline password database, the thing you're looking for is an encryption key.
Why?
Something which can be scaled to take a lot longer to hash can make it expensive and practically unfeasible for someone to crack more than the simplest passwords.
@shanelija SHA-256 is a secure cryptographically secure hash function. It is not and was never intended nor should be used as a key derivation function.
Given time and email are not unique, they should not be used as a salt. Concatenation of a salt is not the correct method either, not for KDF and not for message authentication.
One of the aims of a hash functions is to be fast, really fast, super fast while making it computational infeasible to: make a message that will hash to a given value alter a message that when hashed will produce the same or a give value. Find two different messages with the same hash value.
bcrypt, scrypt, PBKDF2 are perfect for password storage.
YOU are not off the hook yet until you repeat these 2 sentences 10 times: A secure crypto algorithm/system/function/whatever MUST continue to be secure even if the algorithm/system/function/whatever is public.
It is perfectly fine to homebrew crypto given one key condition, you never ever ever ever use it for things that matter.