Я делаю вход в php и пытаюсь решить, использовать ли SHA1, Md5 или SHA256, о котором я читал в другой статье о stackoverflow. Кто-нибудь из них безопаснее других? Могу ли я использовать соль для SHA1 / 256?
Кроме того, это безопасный способ сохранить пароль в виде хэша в mysql?
function createSalt()
{
$string = md5(uniqid(rand(), true));
return substr($string, 0, 3);
}
$salt = createSalt();
$hash = sha1($salt . $hash);
Ответы:
Ни. Вы должны использовать
bcrypt
. Все хэши, о которых вы говорите, оптимизированы для быстрой и простой работы с оборудованием, поэтому их взломать обладают одинаковыми качествами. Если у вас нет другого выбора, по крайней мере, обязательно используйте длинную соль и повторно хешируйте несколько раз.Использование bcrypt в PHP 5.5+
PHP 5.5 предлагает новые функции для хеширования паролей . Это рекомендуемый подход для хранения паролей в современных веб-приложениях.
Если вы используете старую версию PHP, вам действительно следует обновить ее , но пока вы этого не сделаете, вы можете использовать password_compat для предоставления доступа к этому API.
Кроме того, позвольте
password_hash()
генерировать соль для вас. Он использует CSPRNG .Два предостережения относительно bcrypt
NUL
символов.( Доказательство концепции для обоих предостережений здесь.)
У вас может возникнуть соблазн разрешить первое предостережение путем предварительного хеширования ваших паролей перед их запуском через bcrypt , но это может привести к тому, что ваше приложение запустит в первую очередь второе.
Вместо того, чтобы писать свою собственную схему, используйте существующую библиотеку, написанную и / или оцененную экспертами по безопасности.
Zend\Crypt
(часть Zend Framework) предлагаетBcryptSha
PasswordLock
похож на,BcryptSha
но он также шифрует хэши bcrypt с помощью аутентифицированной библиотеки шифрования .TL; DR - использовать bcrypt .
источник
bcrypt
разработан так, чтобы быть медленным, чтобы быть одинаково медленным для взлома.Я думаю, что использование md5 или sha256 или любого хеша, оптимизированного для скорости, совершенно нормально, и мне очень любопытно услышать какие-либо опровержения, которые могут быть у других пользователей. Вот мои причины
Если вы разрешите пользователям использовать слабые пароли, такие как Бог, любовь, война, мир, то независимо от шифрования вы все равно будете позволять пользователю вводить пароль, а не хэш, и эти пароли часто используются первыми, поэтому это НЕ происходит. иметь какое-либо отношение к шифрованию.
Если вы не используете SSL или не имеете сертификата, злоумышленники, прослушивающие трафик, смогут вытащить пароль, а любые попытки шифрования с помощью javascript или тому подобного являются клиентскими, и их легко взломать и преодолеть. Опять же, это НЕ будет иметь ничего общего с шифрованием данных на стороне сервера.
Атаки методом грубой силы будут использовать слабые пароли, и, опять же, поскольку вы разрешаете пользователю вводить данные, если у вас нет ограничения входа в 3 или даже немного больше, проблема снова НЕ будет иметь ничего общего с шифрованием данных.
Если ваша база данных скомпрометирована, то, скорее всего, скомпрометировано все, включая ваши методы хеширования, независимо от того, насколько загадочным вы это сделали. Опять же, это может быть XSS-атака недовольного сотрудника, внедрение sql-кода или другая атака, не имеющая ничего общего с шифрованием вашего пароля.
Я действительно считаю, что вам все равно следует шифрование, но единственное, что я вижу, это шифрование - это не позволяет людям, которые уже имеют или каким-то образом получили доступ к базе данных, просто читать пароль вслух. Если это кто-то неавторизованный в базе данных, у вас есть более серьезные проблемы, о которых стоит беспокоиться, поэтому Sony взяла, потому что они думали, что зашифрованный пароль защищает все, включая номера кредитных карт, все, что он делает, это защищает это одно поле.
Единственное чистое преимущество, которое я вижу для сложного шифрования паролей в базе данных, заключается в том, что сотрудники или другие люди, имеющие доступ к базе данных, не могут просто прочитать пароли. Поэтому, если это небольшой проект или что-то еще, я бы не стал сильно беспокоиться о безопасности на стороне сервера, вместо этого я бы больше беспокоился о защите всего, что клиент может отправить на сервер, например, SQL-инъекция, XSS-атаки или множество других способов, которыми вы может быть скомпрометирован. Если кто-то не согласен, я с нетерпением жду возможности прочитать способ, которым супершифрованный пароль является обязательным со стороны клиента.
Причина, по которой я хотел попытаться прояснить это, заключается в том, что слишком часто люди считают, что зашифрованный пароль означает, что им не нужно беспокоиться о его взломе, и они перестают беспокоиться о защите веб-сайта.
источник
Как отметил Йоханнес Горсет, сообщение Томаса Птачека из Matasano Security объясняет, почему простые универсальные хеш-функции, такие как MD5, SHA1, SHA256 и SHA512, являются плохим выбором хеширования паролей .
Зачем? Они слишком быстрые - вы можете вычислить не менее 1 000 000 хэшей MD5 в секунду на каждое ядро с помощью современного компьютера, поэтому для большинства паролей возможен перебор. И это намного меньше, чем кластер серверов взлома на базе GPU!
Соль без растяжения клавиш означает только то, что вы не можете предварительно вычислить радужную таблицу, вам нужно построить ее специально для этой конкретной соли. Но на самом деле это не усложнит задачу.
Пользователь @Will говорит:
Им не нужно. По-видимому, в случае с LinkedIn они использовали обычную уязвимость SQL-инъекций для получения таблицы БД входа и взломали миллионы паролей в автономном режиме.
Затем он возвращается к сценарию автономной атаки:
Нет, SHA512 не в 10000 раз медленнее MD5 - он занимает примерно вдвое больше. Crypt / SHA512 , с другой стороны, совсем другой зверь, который, как и его аналог BCrypt, выполняет растягивание ключа , создавая совсем другой хеш со встроенной случайной солью и потребует от 500 до 999999 раз больше для вычисления (растяжка настраивается).
Таким образом, для PHP можно выбрать Crypt / Blowfish (BCrypt), Crypt / SHA256 или Crypt / SHA512. Или хотя бы Crypt / MD5 (PHK). См. Www.php.net/manual/en/function.crypt.php
источник
password_hash()
показывает стоимость в самом хеше.Использование
SHA256
. Это не идеально, какSHA512
было бы идеально для быстрого хеширования, но из возможных вариантов это определенный выбор. Как и в случае с любой технологией хеширования, не забудьте солить хеш для дополнительной безопасности.В качестве дополнения, FRKT, пожалуйста, покажите мне, где кто-то может легко взломать соленый хеш SHA256? Мне действительно очень интересно это увидеть.
Важное редактирование:
Двигаясь вперед, используйте
bcrypt
в качестве усиленного хеша. Более подробную информацию можно найти здесь .Редактировать при солении:
Используйте случайное число или случайный поток байтов и т. Д. Вы также можете использовать уникальное поле записи в своей базе данных в качестве соли, таким образом соль будет разной для каждого пользователя.
источник
Кажется, что людям не хватает того, что если у хакера есть доступ к базе данных, он, вероятно, также имеет доступ к файлу php, который хеширует пароль, и, вероятно, может просто изменить его, чтобы отправить ему все успешные комбинации имени пользователя и пароля. Если у него нет доступа к веб-каталогу, он всегда может просто выбрать хэш-пароль и записать его в базу данных. Другими словами, алгоритм хеширования на самом деле не так важен, как безопасность системы, и ограничение попыток входа в систему также, если вы не используете SSL, тогда злоумышленник может просто прослушивать соединение, чтобы получить информацию. Если вам не нужно, чтобы алгоритм занимал много времени для вычисления (для ваших собственных целей), тогда будет достаточно SHA-256 или SHA-512 с пользовательской солью .
В качестве дополнительной меры безопасности настройте скрипт (bash, batch, python и т. Д.) Или программу и дайте ей непонятное имя и попросите его проверить и посмотреть, изменился ли login.php (проверьте дату / время) и отправьте вам электронное письмо если есть. Также, вероятно, следует регистрировать все попытки входа в систему с правами администратора и регистрировать все неудачные попытки входа в базу данных и отправлять журналы по электронной почте.
источник
Все говорят об этом, как будто их можно взломать через Интернет. Как уже говорилось, ограничение попыток делает невозможным взлом пароля через Интернет и не имеет ничего общего с хешем.
Соль обязательна, но сложность или несколько солей даже не имеют значения. Любая соль сама по себе не дает злоумышленнику использовать готовый радужный стол. Уникальная соль для каждого пользователя не дает злоумышленнику создать новую радужную таблицу для использования против всей вашей пользовательской базы.
Безопасность действительно вступает в игру, когда вся база данных скомпрометирована, и хакер может затем выполнить 100 миллионов попыток ввода пароля в секунду против хэша md5. SHA512 примерно в 10 000 раз медленнее. Сложный пароль с сегодняшней мощностью может занять 100 лет для перебора с md5 и в 10 000 раз дольше с SHA512. Соли вообще не останавливают брутфорс, поскольку они всегда должны быть известны, и если злоумышленник загрузил вашу базу данных, он, вероятно, все равно был в вашей системе.
источник
MD5 плох из-за проблем с коллизиями - два разных пароля, возможно, генерируют один и тот же md-5.
Ша-1 был бы достаточно безопасен для этого. Причина, по которой вы храните соленую версию пароля sha-1, заключается в том, что вы, свернувший, не храните пароль пользователя в файле, который они могут использовать с серверами других людей. Иначе какая разница?
Если хакер каким-то образом украдет всю вашу незашифрованную базу данных, единственное, что делает хешированный соленый пароль, - это не дает ему выдавать себя за пользователя для будущих входов - у хакера уже есть данные.
Какая польза от хешированного значения злоумышленника, если пользователь вводит простой пароль?
И даже если хакер, владеющий технологиями будущего, сможет сгенерировать миллион ключей sha-1 в секунду для атаки методом грубой силы, сможет ли ваш сервер обработать миллион входов в систему в секунду, чтобы хакер проверил свои ключи? Это если вы позволяете хакеру попытаться войти в систему, используя соленый sha-1 вместо пароля, как при обычном входе в систему.
Лучше всего ограничить количество неудачных попыток входа в систему некоторым разумным числом - например, 25, а затем отключить пользователя на минуту или две. И если совокупное количество неудачных попыток входа в систему достигнет 250 в течение 24 часов, закройте доступ к учетной записи и отправьте электронное письмо владельцу.
источник
Вот сравнение между MD5 и SHA1. Вы можете получить четкое представление о том, какой из них лучше.
источник
Используйте argon2i . Функция хеширования паролей argon2 выиграла конкурс по хешированию паролей.
Другие разумные варианты, если использование argon2 недоступно, - это scrypt , bcrypt и PBKDF2 . В Википедии есть страницы для этих функций:
MD5, SHA1 и SHA256 - это дайджесты сообщений, а не функции хеширования паролей. Они не подходят для этой цели.
Переход с MD5 на SHA1 или SHA512 не так сильно повысит безопасность конструкции. Вычисление хэша SHA256 или SHA512 происходит очень быстро. Злоумышленник с обычным оборудованием может попробовать десятки миллионов (с одним процессором) или даже миллиарды (с одним графическим процессором) хэшей в секунду. Хорошие функции хеширования паролей включают фактор работы для замедления словарных атак.
Вот предложение для программистов PHP: прочтите FAQ по PHP, затем используйте password_hash () .
источник
Предположим следующий момент: хакеры крадут нашу базу данных, включая пользователей и пароль (зашифрованный). И хакеры создали фальшивую учетную запись с паролем, который им известен.
MD5 слаб, потому что его короткий и популярный, и практически каждое поколение хэшей без пароля слабо защищено от словарной атаки. Но..
Итак, предположим, что мы все еще используем MD5 с SALT. Хакеры не знают SALT, но знают пароль конкретного пользователя. Таким образом, они могут проверить: ????? 12345, где 12345 - известный пароль и ????? это соль. Рано или поздно хакеры могут угадать СОЛЬ.
Однако, если мы использовали MD5 + SALT и применили MD5, то восстановить информацию невозможно. Однако, повторяю, MD5 все еще короток.
Например, допустим, мой пароль: 12345. СОЛЬ - БИЛЛКЛИНТОН.
md5: 827ccb0eea8a706c4c34a16891f84e7b
md5 с хешем: 56adb0f19ac0fb50194c312d49b15378
mD5 с хешем над md5: 28a03c0bc950decdd9ee362907d1798a Я попытался использовать этот онлайн-сервис и не нашел ни одного, который смог бы его взломать. И это только MD5! (может быть, как сегодня, его можно будет взломать, потому что я сгенерировал md5 онлайн)
Если вы хотите переборщить, SHA256 более чем достаточно, если его применять с солью и дважды.
tldr MD5 (HASH + MD5 (пароль)) = нормально, но коротко, SHA256 более чем достаточно.
источник
Шифрование md5 - одно из худших, потому что вам нужно повернуть код, а он уже расшифрован. Я бы порекомендовал вам SHA256. Я программировал немного дольше и получил хороший опыт. Ниже также будет шифрование.
источник