===== Hash password ===== // A salt is randomly generated here to protect again brute force attacks // and rainbow table attacks. The following statement generates a hex // representation of an 8 byte salt. Representing this in hex provides // no additional security, but makes it easier for humans to read. // For more information: // http://en.wikipedia.org/wiki/Salt_%28cryptography%29 // http://en.wikipedia.org/wiki/Brute-force_attack // http://en.wikipedia.org/wiki/Rainbow_table $salt = dechex(mt_rand(0, 2147483647)) . dechex(mt_rand(0, 2147483647)); // This hashes the password with the salt so that it can be stored securely // in your database. The output of this next statement is a 64 byte hex // string representing the 32 byte sha256 hash of the password. The original // password cannot be recovered from the hash. For more information: // http://en.wikipedia.org/wiki/Cryptographic_hash_function $password = hash('sha256', $_POST['password'] . $salt); // Next we hash the hash value 65536 more times. The purpose of this is to // protect against brute force attacks. Now an attacker must compute the hash 65537 // times for each guess they make against a password, whereas if the password // were hashed only once the attacker would have been able to make 65537 different // guesses in the same amount of time instead of only one. for($round = 0; $round < 65536; $round++) { $password = hash('sha256', $password . $salt); } // Here we prepare our tokens for insertion into the SQL query. We do not // store the original password; only the hashed version of it. We do store // the salt (in its plaintext form; this is not a security risk).