Intereting Posts
PHP Неустранимая ошибка: Class 'Facebook' не найден в Отчет о финансовом году в Php, проблема с выбором соответствующего года Проблема при запросе создания сегментов API v3 с помощью PHP-оболочки Примечание. Попытка получить свойство ошибки, отличной от объекта PHP – отправить файл пользователю Исключение SQLSTATE при подключении к базе данных с помощью 000webhost Преобразование логики запросов mysql в построитель запросов Laravel Добавление цвета строки альтернативной таблицы PHP в существующую таблицу HTML Использование ресурсов в качестве индексов массивов в PHP Понимание контейнеров IoC и инъекций зависимостей Рекурсивная php-функция, которая превращает вложенный массив во вложенные html-блоки Соединение с базой данных CakePHP «Mysql» отсутствует или не может быть создано Проблема с кодировкой php: file_get_contents Обновление laravel-композитора: запрашиваемый PHP-расширение dom отсутствует в вашей системе Как сделать регулярное выражение в следующих данных с помощью PHP

SHA1 vs md5 vs SHA256: что использовать для входа в PHP?

Я делаю php login, и я пытаюсь решить, использовать 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 предлагает новые функции для хэширования паролей . Это рекомендуемый подход для хранения паролей в современных веб-приложениях.

 // Creating a hash $hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]); // If you omit the ['cost' => 12] part, it will default to 10 // Verifying the password against the stored hash if (password_verify($password, $hash)) { // Success! Log the user in here. } 

Если вы используете более старую версию PHP, вам действительно нужно обновить ее , но до тех пор, пока вы это не сделаете, вы можете использовать password_compat для раскрытия этого API.

Кроме того, пусть password_hash() генерирует соль для вас. Он использует [CSPRNG] (http: //

Два оговорки о bcrypt

  1. Bcrypt беззвучно усекает любой пароль длиной более 72 символов.
  2. Bcrypt будет усекаться после любых символов NUL .

( Доказательство концепции для обоих оговорок здесь.)

Возможно, у вас возникнет соблазн разрешить первое предостережение, предварительно передав ваши пароли, прежде чем запускать их через bcrypt , но это может привести к тому, что ваше приложение будет запускать headfirst во второй.

Вместо того, чтобы писать свою собственную схему, используйте существующую библиотеку, написанную и / или оцененную экспертами по безопасности.

  • Zend\Crypt (часть Zend Framework) предлагает BcryptSha
  • PasswordLock похож на BcryptSha но также шифрует хэширование bcrypt с помощью аутентифицированной библиотеки шифрования .

TL; DR – использовать bcrypt .

Я думаю, что использование md5 или sha256 или любой хеш, оптимизированный для скорости, совершенно прекрасен, и мне очень любопытно слышать любые опровержения, которые могут иметь другие пользователи. Вот мои причины

  1. Если вы разрешаете пользователям использовать слабые пароли, такие как Бог, любовь, война, мир, то независимо от того, шифрование вы все равно позволяете пользователю вводить пароль, а не хэш, и эти пароли часто используются сначала, поэтому это НЕ иметь какое-либо отношение к шифрованию.

  2. Если вы не используете SSL или не имеете сертификата, то злоумышленники, прослушивающие трафик, смогут вытащить пароль, и любые попытки шифрования с помощью javascript или тому подобного будут на стороне клиента и легко взломать и преодолеть. Опять же, это НЕ будет иметь ничего общего с шифрованием данных на стороне сервера.

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

  4. Если ваша база данных становится скомпрометированной, то, скорее всего, все было скомпрометировано, включая ваши методы хэширования, независимо от того, насколько вы загадочны. Опять же, это может быть недовольная атака XSS сотрудника или SQL-инъекция или другая атака, которая не имеет никакого отношения к шифрованию паролей.

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

Единственное чистое преимущество, которое я вижу в сложных шифрованиях паролей в базе данных, – это отложить сотрудников или других людей, которые имеют доступ к базе данных, просто просматривая пароли. Поэтому, если это небольшой проект или что-то, что я не беспокоился бы о безопасности на стороне сервера, я бы больше беспокоился о том, чтобы обеспечить что-либо, что клиент может отправить на сервер, например, SQL-инъекция, атаки XSS или множество других способов, которыми вы могут быть скомпрометированы. Если кто-то не согласен с этим, я с нетерпением жду, чтобы прочитать способ, которым супершифрованный пароль является обязательным с клиентской стороны.

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

Как отметил Йоханнес Горсет, сообщение Томаса Птачека из Matasano Security объясняет, почему простые функции хэширования общего назначения, такие как MD5, SHA1, SHA256 и SHA512, являются слабым выбором хэширования пароля .

Зачем? Они слишком быстрые – вы можете вычислить не менее 1 000 000 MD5 хэшей на секунду для ядра с современным компьютером, поэтому грубая сила возможна против большинства используемых пользователем паролей. И это намного меньше, чем кластер сервера взлома на основе графического процессора!

Соление без растягивания ключей означает, что вы не можете прекомпретировать радужный стол, вам нужно построить его специально для этой соли. Но на самом деле это не будет намного сложнее.

Пользователь @Will говорит:

Все говорят об этом, как будто их можно взломать через Интернет. Как уже говорилось, ограничение попыток делает невозможным взломать пароль через Интернет и не имеет никакого отношения к хэшу.

Им не нужно. По-видимому, в случае LinkedIn они использовали общую уязвимость SQL-инъекции для получения таблицы входа в систему и взломали миллионы паролей в автономном режиме.

Затем он возвращается к сценарию офлайн-атаки:

Безопасность действительно вступает в игру, когда вся база данных скомпрометирована, и хакер может выполнить 100 миллионов попыток паролей в секунду против хеша md5. SHA512 примерно в 10 000 раз медленнее.

Нет, SHA512 не в 10000 раз медленнее, чем MD5 – это занимает примерно в два раза больше. С другой стороны, Crypt / SHA512 – это совсем другой зверь, который, как и его коллега BCrypt, выполняет ключевое растягивание , создавая совершенно другой хеш со встроенной случайной солью и будет потреблять от 500 до 999999 раз больше, чтобы вычислить (растяжение настраивается).

 SHA512 => aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d Crypt/SHA512 => $6$rounds=5000$usesomesillystri$D4IrlXatmP7rx3P3InaxBeoomnAihCKRVQP22JZ6EY47Wc6BkroIuUUBOov1i.S5KPgErtP/EN5mcO.ChWQW21 

Таким образом, выбор для PHP – это Crypt / Blowfish (BCrypt), Crypt / SHA256 или Crypt / SHA512. Или, по крайней мере, Crypt / MD5 (PHK). См. http://Www.php.net/manual/en/function.crypt.php

Используйте 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, SHA1 и SHA256 – это дайджесты сообщений, а не функции хеширования паролей.

В настоящее время единственным стандартом (как в санкционированном NIST) хэшированием пароля или функцией генерации ключа является PBKDF2 . Другие разумные варианты, если использование стандарта не требуется, – это bcrypt , более новый scrypt и еще более новый argon2i . В Википедии есть страницы для этих функций:

Переключение с MD5 на SHA1 или SHA512 не улучшит безопасность конструкции. Вычисление SHA256 или SHA512 очень быстрое. Злоумышленник с общим аппаратным обеспечением все еще может попробовать десятки миллионов (с одним процессором) или даже миллиарды (с одним графическим процессором) хэшей в секунду. Хорошие функции хэширования пароля включают в себя фактор работы, чтобы замедлить атакующих.

Вот несколько предложений для PHP-программистов: прочитайте FAQ по PHP: http://php.net/manual/en/faq.passwords.php, затем используйте один из следующих:

Вот сравнение между MD5 и SHA1. Вы можете получить четкое представление о том, какой из них лучше.

введите описание изображения здесь

MD5 плохо из-за проблем с столкновением – два разных пароля, возможно, генерируют тот же md-5.

Sha-1 был бы достаточно безопасен для этого. Причина, по которой вы храните засоленную версию пароля sha-1, – это то, что вы не храните apassword пользователя в файле, который они могут использовать с серверами других пользователей. В противном случае, какая разница?

Если хакер крадет всю вашу незашифрованную базу данных, как только, единственное, что сделал хэшированный соленый пароль, не позволяет ему олицетворять пользователя для будущих подписей – у хакера уже есть данные.

Что хорошего делает злоумышленник иметь хешированное значение, если ваши пользовательские входы – это простой пароль?

И даже если бы хакер с будущими технологиями мог генерировать миллион ша-1 ключей в секунду для атаки с использованием грубой силы, мог бы ваш сервер обрабатывать миллион логинов в секунду, чтобы хакер мог проверить свои ключи? Это если вы позволите хакеру попытаться войти в систему с salted sha-1 вместо пароля, как обычный вход в систему.

Лучше всего ограничить неудачные попытки входа в систему на какое-то разумное число – например, 25, а затем вывести пользователя на минутку или два. И если кумулятивные неудачные попытки входа в систему превышают 250 в течение 24 часов, отключите доступ к учетной записи и отправьте по электронной почте владельцу.

Предположим следующее: хакеры украдут нашу базу данных, включая пользователей и пароль (зашифрованные). И хакеры создали фальшивую учетную запись с паролем, который они знают.

MD5 слаб, потому что его короткое и популярное и практически каждое хеш-генерация без пароля слаба в словарной атаке. Но..

Итак, допустим, мы все еще используем MD5 с ОСВ. Хакеры не знают СОЛЬ, но они знают пароль конкретного пользователя. Поэтому они могут проверить: 12345, где 12345 – пароль для получения информации и ????? это соль. Хакеры рано или поздно могут угадать СОЛЬ.

Однако, если мы использовали MD5 + SALT, и мы применили MD5, тогда нет способа восстановить информацию. Однако, повторяю, MD5 по-прежнему невелика.

Например, предположим, что мой пароль: 12345. СОЛЬ – BILLCLINTON

md5: 827ccb0eea8a706c4c34a16891f84e7b

md5 с хешем: 56adb0f19ac0fb50194c312d49b15378

mD5 с хешем по md5: 28a03c0bc950decdd9ee362907d1798a Я попытался использовать эти онлайн-услуги, и я не нашел ни одного, кто смог бы взломать его. И его единственный MD5! (может быть, так как сегодня это будет треск, потому что я создал md5 в Интернете)

Если вы хотите перехитрить, то SHA256 более чем достаточно, если его применять с солью и дважды.

tldr MD5 (HASH + MD5 (пароль)) = нормально, но короткое, SHA256 более чем достаточно.