Безопастность хеша паролей

Добрый день, прочитал статью:
http://www.webasyst.ru/blog/security-improvement-advices-1/
Хочу сделать кастомный алгоритм шифрования и добавить соль.
В предлагаемой функции в статье кажется не правильно указана соль.
По идее солью должно быть "S!aL:T1%(#". и )."_s+A=lT,2?*", а функция без соли должна выглядеть так:

function wa_password_hash($password)
{
return md5(sha1($password));
}

Можно передавать в функцию wa_password_hash к примеру ID пользователя в качестве соли?
Этот ID никогда не меняется и не будет проблем с неработающим паролем.

Можно ли для удобство "соль" вынести в отдельные переменные и уже использовать сами переменные в функции? Это упростит редактирование и чтение кода и хранение соли.Какое количество символов рекомендованно в соли и какие символы в соли не допустимы?

Можно ли использовать функцию crypt с BLOWFISH?

Можно ли использовать sha2, вместо sha1 или вообще sha3?

Можно ли использовать все вышеописанное вместе?

Вообще у разработчиков есть какие-либо обновленные рекомендации по поводу хеширования паролей? Даже мой относительно простенький ноутбук с видеокартой nvidia может переберать тьму паролей в секунду (850 млн. паролей в секунду при расшифровке md5 или sha1).
Есть ли в арсенале разработчиков наработки с более стойким алгоритм шифрования? Сейчас даже на сайте http://php.net черным по белому написано что они не рекомендуют применять md5 и sha1 для защиты паролей, так как они очень просты для перебора современными вычислительными системами.

Хочу защитить своих пользователей, хоть ваш фреймворк безопасный, но с чем черт не шутит.
P.S. Так как я и большенство пользователей фреймворка не программисты, пожалуйста поделитесь рабочими примерами кода.
Спасибо.

9 ответов

  • 2
    Никита 30 ноября 2014 21:15 #

    Неужели все используют стандартный MD5 и не за что не переживают?

    Обидно, что сами разработчики из webasyst'а ничего не написали по теме.

    • +1
      Алексей | shop-script.org Алексей | shop-script.org 17 сентября 2016 15:26 #

      Вероятно, основная проблема в поддержке совместимости с PHP 5.3
      Для 5.5+ этой проблемы нет.
      https://habrahabr.ru/post/194972/

      Неужели все используют стандартный MD5 и не за что не переживают?

      Пользователи точно не переживают, они вообще не знают о том, что это такое.

  • 2
    info@ravencode.ru 17 сентября 2016 19:03 #

    Капчу включите - замучаются брутфорсить. А по поводу того что можно использовать в переопределенном методе - все зависит от параметров Вашего хостинга.

    • +1
      Алексей | shop-script.org Алексей | shop-script.org 17 сентября 2016 19:16 #

      Так безопастность хеша паролей к брутфорсу прямого отношения не имеет.
      Google reCAPTCHA, да очень помогает.

      На счет зависимости от параметров хостинга - полностью согласен.
      Вот разработчики взяли бы и написали, к примеру - для PHP 5.3, для 5.5-5.6, для 7.
      Это же, как бы, массовый продукт. По идее, конечный пользователь вообще не должен заморачиваться с редактированием конфигурационных файлов, а просто забить из админки.
      Но, если уж ему рекомендуют править конфиги, то хотя бы примеров добавили.
      Я лично не сомневаюсь, что у 90% тех кто правил там прямо так и вставлено

      return md5(sha1("S!aL:T1%(#".$password)."_s+A=lT,2?*");
      • +1
        Леман Евгений Леман Евгений 18 сентября 2016 07:04 #

        Правильно сомневаетесь. Не у 90%, а у 99,99%. Как бы так объяснить, что этого хватает?

        ПС Забавно, но почему кодеры так помешаны на упоротости паролей? Это полнейшая бесполезность. Ведь все мы раньше занимались воровством ценных аккаунтов на различных ресурсах и знаем каким способом всё это делается. И на сложность пароля и вашу соль плевать. Как плевать и на сами эти хэши. Они и даром никому не нужны даже с заведомо известной солью.

      • +2
        info@ravencode.ru info@ravencode.ru 18 сентября 2016 15:57 #

        Чтобы дешифровать хеш его вначале как-то получить, а для этого по сути нужно взломать сайт. И тут встает вопрос: зачем расшифровывать хэш когда можно встроить логирование авторизации и получить пароли для алгоритма любой сложности.

  • 0
    Селиванов Сергей 2 декабря 2020 14:10 #

    Решение из документации было не рабочее:
    в wa-config/SystemConfig.class.php добавить метод и всё заведётся

    // todo: добавить логику проверки старых значений mda5 и переписать на новый хэщ

    Рабочее решение: 

    1) Добавляем в класс wa-config/SystemConfig.class.php метод:

        // изменяет генерацию хэша паролей
        public static function wa_password_hash($password)
        {
            return password_hash($password, PASSWORD_BCRYPT);
        }

    2) Переписываем метод waContact::getPasswordHash(), лежит в wa-system/contact/waContact.class.php на:

    public static function getPasswordHash($password)
        {
            if (method_exists(new SystemConfig, 'wa_password_hash')) {
                return SystemConfig::wa_password_hash($password);
            }
            throw new Exception('SystemConfig::wa_password_hash() not defined');
        }

    3) Переписываем метод waAuth::_authByPassword(), лежит в wa-system/auth/waAuth.class.php на:

    protected function _authByPassword($contact, $passwordToCheck)
        {
            $dbHash = isset($contact['password']) && is_scalar($contact['password']) ? $contact['password'] : '';
    
            return password_verify($passwordToCheck, $dbHash);
        }

  • 1
    Селиванов Сергей 3 декабря 2020 11:14 #

    Только не 

    if (method_exists(new SystemConfig, 'wa_password_hash')) {
    а if (method_exists(SystemConfig::class, 'wa_password_hash')) {
  • 1
    maksimfrilanser@gmail.com 4 ноября 2022 23:10 #

    Сергей, спасибо за информацию, работает! НО! Кто будет так делать, будьте осторожны, при обновлении fw wa будет ошибка, при вводе пароля, как со стороны клиентов, так и со стороны учеток администраторов, супер-пользователей (поставили например bcrypt, со временем обновились, а проверка опять вернулась на md5 - соответственно конфликт), так как данный подход изменяет основные файлы фреймворка. РЕШЕНИЕ: либо всегда править эти файлы, после обновления, либо не использовать данный метод. Нужно подталкивать разработчиков WA для исправления внутри fw, md5 для пароля, это НИ О ЧЁМ.

    Cкорости перебора хешей из открытых источников:

    MD5: 16000 M/s

    SHA-1: 5900 M/s

    SHA256: 2050 M/s

    ...

    bcrypt: 8,5 k/s

    Источник: habr, от 2014)))

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите