Простой но надежный класс для создания hash-паролей в БД

FATius

Постоялец
Регистрация
28 Янв 2013
Сообщения
182
Реакции
161
Делюсь своим классом для создания и валидации паролей созданных hash+salt
Код класса password.php
PHP:
namespace Password{

    class Password {
        # return a hashed version of the plain text password.
        public static function hash($plain_text, $cost_factor = 10) { if ($cost_factor < 4 || $cost_factor > 31) throw new Exception('Invalid cost factor');
            $cost_factor = sprintf('%02d', $cost_factor); $salt = ''; for ($i = 0; $i < 8; ++$i) $salt .= pack('S1', mt_rand(0, 0xffff));
            $salt = strtr(rtrim(base64_encode($salt), '='), '+', '.');
            $pass=array('hash'=>crypt($plain_text, '$2a$'.$cost_factor.'$'.$salt),'salt'=>$salt);
            return $pass;}
# validate that a hashed password is the same as the plain text version
        public static function validate($plain_text, $hash, $salt) {
            $cost_factor = 10;
            if ($cost_factor < 4 || $cost_factor > 31) throw new Exception('Invalid cost factor');
            $cost_factor = sprintf('%02d', $cost_factor);
            return crypt($plain_text, '$2a$'.$cost_factor.'$'.$salt) == $hash; }
    }
}

В файле register.php
обращаемся к классу password
PHP:
include('classes/password.php');
use Password\Password as Password;

$hash = Password::hash($_POST["password"])
;
//в ответ получаем массив
$hash['salt']; //соль
$hash['hash']; // хеш пароля
// записываем в таблицу
файл авторизации auth.php
PHP:
include'classes/password.php';

use Password\Password as Password;
// для валидации, когда логинятся, сравниваем отправленный пароль в чистом виде
// Берем из таблицы userdata хешированный пароль и соль $userdata['pass'], $userdata['salt']
// $_POST['password'] -> нехешированный пароль в чистом виде из формы


if (Password::validate($_POST['password'],$userdata['pass'], $userdata['salt'])){
// тут код, если пароль валидный
}
 
PHP:
            $cost_factor = 10;
            if ($cost_factor < 4 || $cost_factor > 31) throw new Exception('Invalid cost factor');

Эм, стесняюсь спросить...а зачем проверять значение cost_factor, если этой переменной строкой выше задано значение 10? :crazy:

Ну, и форматирование кода...эм, альтернативное так сказать)

P.S. Пардон за критику)
 
Эм, стесняюсь спросить...а зачем проверять значение cost_factor, если этой переменной строкой выше задано значение 10? :crazy:

Ну, и форматирование кода...эм, альтернативное так сказать)

P.S. Пардон за критику)
я понимаю, что, когда нечем блеснуть, то цепляешься к деталям, cost_factor = переменная уровня сложности шифрования, который подаешь вместе с шифрованием пароля, кому нужно, тот понял о чем речь, для обывателя уровень сложности по умолчанию 10.
 
я понимаю, что, когда нечем блеснуть, то цепляешься к деталям, cost_factor = переменная уровня сложности шифрования, который подаешь вместе с шифрованием пароля, кому нужно, тот понял о чем речь, для обывателя уровень сложности по умолчанию 10.
вы всё-таки обидились) не хотел задеть вашу тонкую душевную огранизацию :)

P.S. конечно, куда уж мне убогому блистать такими перлами :oops:
а так-то да...кому надо все всё поняли)
 
вы всё-таки обидились) не хотел задеть вашу тонкую душевную огранизацию :)

P.S. конечно, куда уж мне убогому блистать такими перлами :oops:
а так-то да...кому надо все всё поняли)
Спасибо, рад, что мы поняли друг друга))
 
Назад
Сверху