- Автор темы
- #1
Делюсь своим классом для создания и валидации паролей созданных hash+salt
Код класса password.php
В файле register.php
обращаемся к классу password
файл авторизации auth.php
Код класса 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']; // хеш пароля
// записываем в таблицу
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'])){
// тут код, если пароль валидный
}