Secure Password Hashing in PHP
This class helps you securely hash passwords in PHP. It is hardened against precomputation and brute force attacks.
Example usage:
More examples and discussion at: Secure password hashing and storage in PHP
/** * Generate cryptographic Hashes for passwords * * Features: * Harderned against precomputation attacks like rainbow tables (using unique salts) * Harderned against brute force and dictionary attacks (using key stretching and optional secret key) * * http://en.wikipedia.org/wiki/Password_cracking * * Note: for PHP4 and lower, just remove the "public static" before function declaration * * @author gabe@fijiwebdesign.com * @link http://www.fijiwebdesign.com/ * @version $Id$ */ class Password_Hash { /** * Generate the Hash * @return String * @param $password String * @param $salt String[optional] * @param $iterations Int[optional] * @param $secret String[optional] */ public static function generate($password, $salt = null, $iterations = 10000, $hash_function = 'sha1', $secret = '') { $salt or $salt = self::generateToken(); $hashes = array(); $hash = $password; // hash a sequence of hashes, each hash depends on the last one, so any implementation must hash each one individually $i = $iterations; while(--$i) { $hash = $hash_function($hash.$salt.$secret); } return implode(':', array($hash, $iterations, $hash_function, $salt)); } /** * Verify a password meets a hash * @return Bool * @param $password String * @param $hash String * @param $secret String[optional] */ public static function verify($password, $hash, $secret = '') { list($_hash, $iterations, $hash_function, $salt) = explode(':', $hash); return ($hash == self::generate($password, $salt, $iterations, $hash_function, $secret)); } /** * Generate a random hex based token * @return String * @param $length Int[optional] */ public static function generateToken($length = 40) { $token = array(); for( $i = 0; $i < $length; ++$i ) { $token[] = dechex( mt_rand(0, 15) ); } return implode('', $token); } }
Example usage:
// generating the hash $password = 'test'; $hash = Password_Hash::generate($password); // verifying a password $result = Password_Hash::verify($password, $hash); // dump results var_dump($hash, $result);
More examples and discussion at: Secure password hashing and storage in PHP