passwordHashMethods)) { $this->initPasswordHashMethods(); } $closure = reset($this->passwordHashMethods); return $closure['verify']($passwd, $hash, $staticSalt); } /** * Validate a password against all supported hashing methods. * * @param string $passwd Plain-text password to validate. * @param string $hash Stored password hash. * @param string $staticSalt Static salt used by legacy hash methods. * * @return bool */ public function validateHash($passwd, $hash, $staticSalt = _COOKIE_KEY_) { if (!count($this->passwordHashMethods)) { $this->initPasswordHashMethods(); } foreach ($this->passwordHashMethods as $closure) { if ($closure['verify']($passwd, $hash, $staticSalt)) { return true; } } return false; } /** * Hash a plain-text password with the primary hashing method. * * @param string $plaintextPassword Password to hash. * @param string $staticSalt Static salt reserved for legacy hash methods. * * @return string */ public function passwordHash($plaintextPassword, $staticSalt = _COOKIE_KEY_) { if (!count($this->passwordHashMethods)) { $this->initPasswordHashMethods(); } $closure = reset($this->passwordHashMethods); return $closure['hash']($plaintextPassword, $staticSalt, $closure['option']); } /** * Initialize the supported password hashing methods. * * @return void */ private function initPasswordHashMethods() { $this->passwordHashMethods = array( 'bcrypt' => array( 'option' => array(), 'hash' => function ($passwd, $staticSalt, $option) { return password_hash($passwd, PASSWORD_BCRYPT); }, 'verify' => function ($passwd, $hash, $staticSalt) { return password_verify($passwd, $hash); }, ), 'md5' => array( 'option' => array(), 'hash' => function ($passwd, $staticSalt, $option) { return md5($staticSalt.$passwd); }, 'verify' => function ($passwd, $hash, $staticSalt) { return md5($staticSalt.$passwd) === $hash; }, ), ); } }