Чем выгодней шифровать пароли?

Тема в разделе "PHP", создана пользователем Bezhev, 16 авг 2013.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Bezhev

    Bezhev

    Регистр.:
    26 дек 2012
    Сообщения:
    362
    Симпатии:
    123
    Привет.

    Делаю небольшую cms под свои нужды, озадачился выбором метода криптования пароля. какой алгоритм лучше использовать?
    md5 или sha1 ?

    Перед постом погуглил, но в инете мнения расходятся.
    Может есть какие-то другие, новые методы.. лучше, качественней.
     
  2. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.726
    Симпатии:
    2.100
    без разницы если ломанут другую часть цмс (либо соседей) и получат доступ к файлам или базе. или пароль не длинный и слово из словаря. ну вообщем задача более чем "каким алгоритмом"?
    главное не забыть про http://scientopia.org/blogs/goodmath/2013/03/02/passwords-hashing-and-salt/ ну и без фанатизма конечно же.
     
    donvictorio нравится это.
  3. neowalker

    neowalker Писатель

    Регистр.:
    29 дек 2012
    Сообщения:
    1
    Симпатии:
    1
    >>Делаю небольшую cms под свои нужды, озадачился выбором метода криптования пароля. какой алгоритм лучше использовать?
    md5 или sha1 ?

    Про соль не забудь, соль храни в отдельном поле, можно вообще в соседней БД, потом склеивай соль с пассом по вкусу. Надежно!
    Блин. Написал ответ и вижу, что ссылку то дали уже :)
     
    Шумадан нравится это.
  4. Darkmind

    Darkmind SNMP maniac

    Регистр.:
    31 май 2006
    Сообщения:
    183
    Симпатии:
    76
    Многие фреймворки предоставляют свои средства для шифрования. Например, в Yii доступен CPasswordHelper, который реализует обёртку для crypt(). Собственно, crypt() с солью и будет на данный момент оптимальным методом для хэширования паролей.
     
    Шумадан нравится это.
  5. esche

    esche

    Регистр.:
    9 авг 2009
    Сообщения:
    359
    Симпатии:
    243
    Относительно недавно алгоритм SHA3 выбрали http://csrc.nist.gov/groups/ST/hash/sha-3/winner_sha-3.html
    Нативной реализации в php (пока?) нет, однако есть код на github: тут, например

    crypt в зависимости от настроек системы и переданной соли может использовать разный алгоритм (в том числе и md5).

    DES, например, учитывает только первые 8 символов, поэтому "с большой вероятностью" результат будет одинаковым:
    Код:
    echo crypt('12345678','salt');
    echo '<br>';
    echo crypt('1234567891091029','salt');
    Darkmind, с поправкой использовать соль для Blowfish-алгоритма вида $2a$07$blablabla вариант принимается.. но опять же есть нюанс

    Ещё можно использовать http://www.php.net/manual/en/function.hash.php с явным указанием алгоритма
    (там же в комментариях можно статистику посмотреть - длину и сравнение скоростей вычисления по каждому алгоритму)
    Итого:
    Blowfish с солью - вполне приемлемый. Однако, если хочется "чего-то нового" - можно в сторону SHA3 посмотреть или выбрать из экзотичных
     
    latteo нравится это.
  6. CAPAXA

    CAPAXA

    Регистр.:
    7 июн 2007
    Сообщения:
    903
    Симпатии:
    540
    Как вариант можно использовать md5+salt но результат предварительно обработанный скремблером. Т.е. Символы перемешаны по определенному правилу. Поскольку правило знаете только вы, то утечка БД совершенно не страшна.
     
  7. intuitive

    intuitive Создатель

    Регистр.:
    16 янв 2013
    Сообщения:
    15
    Симпатии:
    5
    CAPAXA нравится это.
  8. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    375
    Симпатии:
    41
    А чем плох md5? Тем что пароли можно расшифровать с помощью различных сервисов? Так можно юзать md5(md5($pass)) Или этот метод тоже плох?
    И расскажите про соль, статья http://scientopia.org/blogs/goodmath/2013/03/02/passwords-hashing-and-salt/ на английском, из хабра тоже не совсем понятно где лучше её хранить, а главное как проверять пароль, когда юзер логинится на сайт
     
  9. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.726
    Симпатии:
    2.100
    как правило в базе хранится закодированый пароль в одном поле и соль в другом, вариантов кодирования много, например md5($salt.md5($pass.$salt)). суть в том, что вы получаете имя пользователя, которое уникально и пароль, дальше, кодируете пароль согласно алгоритму и проверяете выборкой из базы.
    грубо говоря:
    $username = $_POST['username'];
    $pass = $_POST['password'];
    $salt = 'jdweidowenobo322';
    $hashed = md5($salt.md5($pass.$salt));
    $sql = "SELECT COUNT(*) FROM users where username = '$username' AND password = '$hashed'"; и потом проверяете сколько строк вернулось, если > 0 то всё прошло успешно, иначе либо имя неверное либо пароль.

    код скорее представлен в виде примера, чтоб показать каким именно способом можно реализовать такое, и не включает проверки валидности того, что запостил пользователь.
     
    kupidonkhv и donvictorio нравится это.
  10. Bezhev

    Bezhev

    Регистр.:
    26 дек 2012
    Сообщения:
    362
    Симпатии:
    123
    Как раз через пару дней наткнулся на новые возможности php5.5, думаю что cryprt будет предпочтительней на данный момент.
     
Статус темы:
Закрыта.