aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/includes/crypto/driver/bcrypt.php
diff options
context:
space:
mode:
authorMarc Alexander <admin@m-a-styles.de>2013-06-15 10:11:05 +0200
committerMarc Alexander <admin@m-a-styles.de>2013-09-14 13:51:24 +0200
commit78a83691738a2bcd0e6cb27b5dcbda8809a5d615 (patch)
treef438df5cf1b3cad319b5ad98ef32a60a7995f07b /phpBB/includes/crypto/driver/bcrypt.php
parent31d2a8ef05ecd6b3f086230d95c0ae10d4f09474 (diff)
downloadforums-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.php87
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);
+ }
+}