I am new to the topic and wanted to know the concept of having salted hashes before going down to the technical details.
From what I have understand
- password - plaintext
- hash password - plaintext password being encrypted by a hashing algorithm that is irreversible (one way)
- salted hash password - random text + plain text password being hashed / hash (salt+plaintext)
- a rainbow table is list of pre-calculated hash results from a list of dictionary words, comparing the hashed passwords against the list in the rainbow table for a match will reveal the actual password being used by the user.
Hence, 2 of the same plaintext passwords will not have the same hash value due to the random value of the salt.
The salt is sometimes stored with hash password.
From the above,
- I am assuming that there is no max password attempts - How does having a salt prevent a malicious user from attempting to to brute-force the password into the system by just trying random password (e.g over a dictionary list)? They are using the same legit login mechanism as compared to the actual-user by just attempting/inputting different password per login.
- If the salt prevents a rainbow attack by having random data appended to the plaintext before the MD5 hash, the very 1st criteria is that the rainbow attack has a list of hashed (salt+password) to compared with. Now, isn't the system already compromised when the malicious user has that list of hashed passwords?
- If the salt and hashed password are stored together, wouldn't that malicious user (instead of using a rainbow table) just recompute his list of dictionary text + the salt retrieved to derive the hash results, and compare them against the hashed password in the retrieved list?
It is just that now the rainbow table is built based on a single salt value for a particular hashed password entry. For another password entry, another precomputed rainbow table based on that associated salt will have to be use.
Is my understanding wrong? So what does salt really help?