diff options
| author | Marc Alexander <admin@m-a-styles.de> | 2013-06-15 10:11:05 +0200 |
|---|---|---|
| committer | Marc Alexander <admin@m-a-styles.de> | 2013-09-14 13:51:24 +0200 |
| commit | 78a83691738a2bcd0e6cb27b5dcbda8809a5d615 (patch) | |
| tree | f438df5cf1b3cad319b5ad98ef32a60a7995f07b /phpBB/includes/crypto/driver/bcrypt.php | |
| parent | 31d2a8ef05ecd6b3f086230d95c0ae10d4f09474 (diff) | |
| download | forums-78a83691738a2bcd0e6cb27b5dcbda8809a5d615.tar forums-78a83691738a2bcd0e6cb27b5dcbda8809a5d615.tar.gz forums-78a83691738a2bcd0e6cb27b5dcbda8809a5d615.tar.bz2 forums-78a83691738a2bcd0e6cb27b5dcbda8809a5d615.tar.xz forums-78a83691738a2bcd0e6cb27b5dcbda8809a5d615.zip | |
[feature/passwords] Add basic bcrypt drivers for $2a$ & $2y$ prefix
The $2a$ prefix is the basic implementation with the $2y$ prefix extending
that class. However, the default hashes for phpBB should be generated with
$2y$ unless the PHP version is older than 5.3.7.
PHPBB3-11610
Diffstat (limited to 'phpBB/includes/crypto/driver/bcrypt.php')
| -rw-r--r-- | phpBB/includes/crypto/driver/bcrypt.php | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/phpBB/includes/crypto/driver/bcrypt.php b/phpBB/includes/crypto/driver/bcrypt.php new file mode 100644 index 0000000000..8fe9b91ab8 --- /dev/null +++ b/phpBB/includes/crypto/driver/bcrypt.php @@ -0,0 +1,87 @@ +<?php +/** +* +* @package phpBB3 +* @copyright (c) 2013 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +/** +* @ignore +*/ +if (!defined('IN_PHPBB')) +{ + exit; +} + +/** +* @package crypto +*/ +class phpbb_crypto_driver_bcrypt extends phpbb_crypto_driver_base +{ + const PREFIX = '$2a$'; + + /** + * @inheritdoc + */ + public function get_prefix() + { + return self::PREFIX; + } + + /** + * @inheritdoc + */ + public function get_type() + { + return get_class($this); + } + + /** + * @inheritdoc + */ + public function hash($password, $salt = '') + { + // The 2x and 2y prefixes of bcrypt might not be supported + // Revert to 2a if this is the case + $prefix = (!$this->is_supported()) ? '$2a$' : self::PREFIX; + + if ($salt == '') + { + $salt = $prefix . '10$' . $this->get_random_salt(); + } + + $hash = crypt($password, $salt); + return $hash; + } + + /** + * @inheritdoc + */ + public function check($password, $hash) + { + $salt = substr($hash, strpos($hash, '$', 4) + 1, 22); + var_dump('bcrypt salt: ' . $salt . ' with length ' . strlen($salt)); + if (strlen($salt) != 22) + { + return false; + } + + if ($hash == $this->hash($password, $salt)) + { + return true; + } + return false; + } + + /** + * Get a random salt value with a length of 22 characters + * + * @return string Salt for password hashing + */ + protected function get_random_salt() + { + return substr(str_replace('+', '.', bin2hex(openssl_random_pseudo_bytes(22))), 0, 22); + } +} |
