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

Тема в разделе "PHP", создана пользователем FATius, 19 янв 2018.

Модераторы: latteo
  1. FATius

    FATius

    Регистр.:
    28 янв 2013
    Сообщения:
    164
    Симпатии:
    157
    Делюсь своим классом для создания и валидации паролей созданных 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 || $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(00xffff));
                
    $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 || $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'])){
    // тут код, если пароль валидный
    }
     
    Sorcus нравится это.
  2. Nei

    Nei Nosce te ipsum

    Регистр.:
    5 сен 2009
    Сообщения:
    670
    Симпатии:
    521
    Эм, стесняюсь спросить...а зачем проверять значение cost_factor, если этой переменной строкой выше задано значение 10? :crazy:

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

    P.S. Пардон за критику)
     
  3. FATius

    FATius

    Регистр.:
    28 янв 2013
    Сообщения:
    164
    Симпатии:
    157
    я понимаю, что, когда нечем блеснуть, то цепляешься к деталям, cost_factor = переменная уровня сложности шифрования, который подаешь вместе с шифрованием пароля, кому нужно, тот понял о чем речь, для обывателя уровень сложности по умолчанию 10.
     
  4. Nei

    Nei Nosce te ipsum

    Регистр.:
    5 сен 2009
    Сообщения:
    670
    Симпатии:
    521
    вы всё-таки обидились) не хотел задеть вашу тонкую душевную огранизацию :)

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

    FATius

    Регистр.:
    28 янв 2013
    Сообщения:
    164
    Симпатии:
    157
    Спасибо, рад, что мы поняли друг друга))
     
  6. Цуиьфыеук

    Цуиьфыеук Создатель

    Регистр.:
    15 янв 2018
    Сообщения:
    37
    Симпатии:
    19
    может быть параметр $cost_factor сделать параметром функции?
    PHP:
    public static function validate($plain_text$hash$salt$cost_factor 10)
     
  7. FATius

    FATius

    Регистр.:
    28 янв 2013
    Сообщения:
    164
    Симпатии:
    157
    я поделился с Вами удочкой, а рыбку уже сами ловите!