За последние 24 часа нас посетили 17643 программиста и 1649 роботов. Сейчас ищут 927 программистов ...

crypt, CRYPT_BLOWFISH, *0

Тема в разделе "PHP для новичков", создана пользователем VLK, 19 дек 2015.

  1. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Кто подскажет в чем проблема:
    Код (PHP):
    1. function GetRandomString($min, $max) {
    2.     $dic = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM';
    3.     $length = rand($min,$max);
    4.     $string = '';
    5.     for($i = 0; $i < $length; $i++) {
    6.         $string .= $dic[ rand(0, strlen($dic)-1) ];
    7.     }
    8.     return $string;
    9. }
    10.  
    11. function Encoding($str, $data = false) {
    12.     if ($data) {
    13.         return crypt($str, $data) == $data true : false;
    14.     }
    15.     else {
    16.         return crypt($str, '$2y$07$' . GetRandomString(10,25));
    17.     }
    18. }
    19.  
    20. $code = GetRandomString(10, 20);
    21. $hash = Encoding($code);
    22.  
    23. $result = Encoding($code, $hash);
    24.  
    25. var_dump($code, $hash, $result);
    на OpenServer $hash часто возвращает в виде "*0" (иногда нормальный хеш), без кавычек естественно, в IDE phpDesigner который использует версию php 5.4.15 все ок, правда периодически $result равно false, я вычитал если возвращает "*0" значит в качестве соли crypt были переданные не те символы, но я передаю те - 0-9A-Za-z, в чем проблема?
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Дык тебя за ногу. Ну кто так генерирует случайные числа? o_O
    Причем здесь опенсервер... в доках же написано что это исправление поведения blowfish...
    Обновись хотя бы до 5.5 что бы использовать password_hash
    Все что ниже 5.5 признано страшно дырявым:(

    По вопросу раз с не умеешь пользоваться даже гуглом =D

    http://stackoverflow.com/questions/25104132/php-blowfish-al ... -as-output
     
  3. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    В open-server можно переключить версию PHP
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    так этот crypt совсем дырявый?

    почитал
    http://habrahabr.ru/post/194972/
    http://habrahabr.ru/post/184220/

    вроде как password_hash это упрощенный вариант crypt, в частности не надо парится с солью, она делается автоматически.
    кстати проверку успешно проходят из crypt в password_verify, так и password_hash в crypt.

    Добавлено спустя 28 минут 41 секунду:
    и еще преимущество password_hash там надо выставлять параметр PASSWORD_DEFAULT и при появлении новых алгоритмов хеширования, от версии к версии этот PASSWORD_DEFAULT будет меняться (ну само значение внутри этой константы), что будет гарантировать использование всегда актуальных типов хеширования.
    как то так.
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Шифрование сложная штука, очень просто выстрелить себе в ногу, лучше использовать password_hash (поищи реализацию для 5.4 если нужно) по возможности, у тебя какая задача?
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Вот такие вот вещи напрягают сильно. Аккуратным надо быть. А то может статься, что внезапно вся база пользователей станет невалидной и никто не сможет залогиниться.
     
  7. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    я тоже об этом подумал, но тут не так.
    Короче сама функция что то типа обертки, а дальше идет тип хеширования, когда ты пароль хешируешь то в него записывается тип хеширования, в частности как я понял ты можешь его узнать при помощи функции password_get_info, да и без него он пишет в начале, вот например - $2a$07$, 2a это тип, 07 это вычислительная мощь, что то такое, соответственно при проверке хешей при помощи password_verify даже если они были шифрованы старыми алгоритмами они будут нормально проверены, т.к. password_verify из самого хеша возьмет алгоритм и на его основе будет проверять.

    кстати я тестировал, хеши сделанные при помощи password_hash проходят проверку на crypt и в обратном направлении, из crypt в password_hash.
    Но мне почему что это так потому что под password_hash скрывается как раз crypt, в принципе это и на писано в описании статей.
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    оно не так работает

    там алгоритм сохраняется и можно перехешировать при смене.
     
  9. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ну главное что бы не получилось так, что в один прекрасный момент не будет проходить валидация в следствии того что, что-то там изменилось и придется как то восстанавливать пароль.
    Но вроде такого не должно быть т.к. я описал все выше.