I am looking into building a login system and after reading the php manual when you pass a 2 digit salt to the crypt()
function it returns a hash string, and th
PHP crypt inherits this behaviour from the UNIX crypt()
function, which was used for generating password hashes in the UNIX passwd
file. It's necessary to store the salt somewhere, or you can't verify later that the password is correct. For the passwd
file, the simple behaviour was just to prepend the salt (always two characters) to the start of the crypted password, which makes it simple to store it in a single field.
The statement that the salt value should be kept secret is open to misinterpretation. For best practice you should not publish your salts, in the same way that you should not publish your password hashes. Giving an attacker the hashes and salts makes it easy for them to run a brute-force attack without generating suspicious traffic to your system. However, the system should still be secure even if an attacker can see both salt and hashed password.
In fact, there's nowhere you can store the hash that couldn't, in principle, be compromised by a hacker in exactly the same way as the hashed passwords. If the password-checking code can access it, then you have to assume that someone who's compromised the system could get access to it as well.