Безопастность хеша паролей
Добрый день, прочитал статью:
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. Так как я и большенство пользователей фреймворка не программисты, пожалуйста поделитесь рабочими примерами кода.
Спасибо.
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 ответов
Неужели все используют стандартный MD5 и не за что не переживают?
Обидно, что сами разработчики из webasyst'а ничего не написали по теме.
Вероятно, основная проблема в поддержке совместимости с PHP 5.3
Для 5.5+ этой проблемы нет.
https://habrahabr.ru/post/194972/
Пользователи точно не переживают, они вообще не знают о том, что это такое.
Капчу включите - замучаются брутфорсить. А по поводу того что можно использовать в переопределенном методе - все зависит от параметров Вашего хостинга.
Так безопастность хеша паролей к брутфорсу прямого отношения не имеет.
Google reCAPTCHA, да очень помогает.
На счет зависимости от параметров хостинга - полностью согласен.
Вот разработчики взяли бы и написали, к примеру - для PHP 5.3, для 5.5-5.6, для 7.
Это же, как бы, массовый продукт. По идее, конечный пользователь вообще не должен заморачиваться с редактированием конфигурационных файлов, а просто забить из админки.
Но, если уж ему рекомендуют править конфиги, то хотя бы примеров добавили.
Я лично не сомневаюсь, что у 90% тех кто правил там прямо так и вставлено
Правильно сомневаетесь. Не у 90%, а у 99,99%. Как бы так объяснить, что этого хватает?
ПС Забавно, но почему кодеры так помешаны на упоротости паролей? Это полнейшая бесполезность. Ведь все мы
раньше занимались воровством ценных аккаунтов на различных ресурсах изнаем каким способом всё это делается. И на сложность пароля и вашу соль плевать. Как плевать и на сами эти хэши. Они и даром никому не нужны даже с заведомо известной солью.Чтобы дешифровать хеш его вначале как-то получить, а для этого по сути нужно взломать сайт. И тут встает вопрос: зачем расшифровывать хэш когда можно встроить логирование авторизации и получить пароли для алгоритма любой сложности.
Решение из документации было не рабочее:
в wa-config/SystemConfig.class.php добавить метод
и всё заведётся// todo: добавить логику проверки старых значений mda5 и переписать на новый хэщ
Рабочее решение:
1) Добавляем в класс wa-config/SystemConfig.class.php метод:
2) Переписываем метод waContact::getPasswordHash(), лежит в wa-system/contact/waContact.class.php на:
3) Переписываем метод waAuth::_authByPassword(), лежит в wa-system/auth/waAuth.class.php на:
Только не
Сергей, спасибо за информацию, работает! НО! Кто будет так делать, будьте осторожны, при обновлении 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)))