Соль

Discussion in 'PHP' started by Anwy, 3 Mar 2015.

  1. Anwy

    Anwy Elder - Старейшина

    Joined:
    16 Dec 2004
    Messages:
    265
    Likes Received:
    232
    Reputations:
    45
    Как защитить пароли юзеров на своем сайте с помощью соли?
    Для чего используется соль?
    Допустим вашу базу данных на сайте взломали, а там полностью открыты пароли. Никуда не годится, нужно шифровать что бы хакеру обидно стало.
    Ну что же, можно зашифровать в хэш md5, функцией md5()
    Например:

    PHP:
    <?
    $pass md5("12345");
    echo 
    $pass;
    ?>
    Выведет результат:
    827ccb0eea8a706c4c34a16891f84e7b
    Но не тут то было, хакер полезет в ближайший словарь, допустим http://crackfor.me/
    И дешифрует хэш, такой способ шифровки надежен для автоматически сгенерированных паролей состоящих из 16 символов, ну ведь не все используют такие пароли, правильно?
    Придется усложнять задачу, «присыпим» соль.
    Соль – это автоматически генерируемая строка, которая «сыпится» на хэш md5.
    Создадим функцию для генерации соли:

    PHP:
    function gSalt() {
    $salt '';
    $length rand(5,10); // длина соли (от 5 до 10 символов)
    for($i=0$i<$length$i++) {
    $salt .= chr(rand(33,126)); // выбираем символ из ASCII-table
    }
    return 
    $salt// выводим соль
    }


    Использовать можно как хотите, записываете в бд.
    например:
    PHP:
    $pass md5('12345').gSalt();
    mysql_query("INSERT INTO users (pass, salt) VALUES (".$pass.",".gSalt().")");

    Теперь лучше усложнить задачу, два раза зашифруем пароль, сначала в md5, потом сам хэш md5 с солью опять в md5
    PHP:
    $pass md5(md5('12345').gSalt());
    Можно приступить к проверке пароля на правильность.
    PHP:
    $md5 '9e643770b1a1d3fdcafec1c3a1e02d27';
    $salt 'i[BxGS';
    if (
    md5(md5('12345').$salt) == $md5) {
    echo 
    'Пароль правильный';
    }
    ну $salt и $md5 выбираем из базы данных, пароль вставляем тот что записывали в бд с солью (в данном случае 12345)
    Если выводит «Пароль правильный» значит вы все верно сделали
     
    2 people like this.
  2. 5maks5

    5maks5 Elder - Старейшина

    Joined:
    29 Aug 2010
    Messages:
    451
    Likes Received:
    264
    Reputations:
    40
    За старания плюс и за разжевывания общих понятий.
    Но есть одно но: md5 уже не надежен.
    Даже с солью и двойным и тройным заворачиванием в md5.
    Многие перешли на SHA1, SHA256. С солью :)
    С данными хэшами можно с уверенностью сказать, что пару лет за них можно не беспокоится.
     
  3. lifescore

    lifescore Elder - Старейшина

    Joined:
    27 Aug 2011
    Messages:
    651
    Likes Received:
    511
    Reputations:
    72
    Да и sha уже на уровне того же md5 лет 5+ назад.
    В первую очередь это конечно минимальная энтропия..
    8 символов хоть и некого рода "стандрт", но всеже уже маловато... Хотя в случае с sha думаю будет достаточно на пол годика до плановой смены пассов

    А вообще лучше еще добавить всевозможные хитрости, типо strrev и тд, стойкости конечно не прибавит, но подумать заставит)
     
  4. waik

    waik Elder - Старейшина

    Joined:
    2 Nov 2008
    Messages:
    405
    Likes Received:
    163
    Reputations:
    12
    Написано легко и понятно, но для статьи этого маловато, не хватает разделов как "введение", "теория", "объяснение проблемы", "зачем это нужно ".и.т.д. У вас сразу идет кусок практики и так-же быстро заканчивается.

    p/s Если уж очень хочется безопасности то Двухфакторная авторизация в помощь, хотя и свои минусы у ней тоже есть, но они скорее в плане организации а не в плане безопасности.
     
    #4 waik, 4 Mar 2015
    Last edited: 4 Mar 2015
    1 person likes this.
  5. grimnir

    grimnir Members of Antichat

    Joined:
    23 Apr 2012
    Messages:
    1,114
    Likes Received:
    830
    Reputations:
    231
    Хотелось бы еще в статье увидеть ,как подобное решение влияет на нагрузку сервера
     
    _________________________
  6. fl47590

    fl47590 Member

    Joined:
    15 Nov 2013
    Messages:
    54
    Likes Received:
    8
    Reputations:
    0
    К вопросу надежности MD5: нет, не надежен. Применительно к PHP, начиная с 5.5 версии доступно расширение Password Hashing, предоставляющее несколько могучих функций, например:
    password_hash,
    password_verify.
    Их и рекомендуется использовать в данный момент для создания механизма аутентификации пользователей.
    Более подробно - http://habrahabr.ru/post/194972/ .
    Если вкратце, то чем данные функции лучше md5\sha1? Настраиваемой стоимостью вычислений, что, скорее всего, превратит брут в непосильную задачу.