Intereting Posts
Вставка нескольких значений в MySQL сразу Добавление дней к дате с помощью PHP Извлечение определенных данных с веб-страницы с использованием PHP Загружать контент из MySQL в прокрутку с помощью сообщения AJAX HTACCESS / PHP – переписывать URL-адрес при повторном указании на другой URL-адрес Почему загрузка изображения завершается ошибкой is_uploaded_file php? Автоматический текст в кратком описании продуктов WooCommerce Является ли PHP или Perl правильным выбором для моего веб-проекта? PHP SQLSRV Сортировка с параметром подготовленного заявления Как автоматически регистрировать нового пользователя после регистрации у пользовательского провайдера в Silex? Кнопки и сеансы радиостанции PHP Отправить HTML-сообщение по электронной почте через PHP? Как определить, что float составляет половину номера? phpunit: как получить количество тестов в тестовом каталоге без запуска теста Выполнить функцию PHP с помощью onClick

PHP – MD5, SHA, Хейшинг-безопасность

Я разработчик нового веб-сайта, созданного на PHP, и мне интересно, что именно лучше всего использовать для хэширования. Я посмотрел на md5 и sha1, но есть ли что-то более безопасное.
Прошу прощения, если это вопрос, но я новичок в PHP Security, и я стараюсь сделать сайт максимально безопасным. И что такое соль?
Благодаря,
Waseem

Во-первых, md5 и sha1 оказались непримиримыми к атакам на столкновение и могут легко получать радугу (когда они видят, что ваш хэш в базе данных общих паролей).
В настоящее время существует две вещи, которые достаточно безопасны для паролей, которые вы можете использовать.
Первый из них – sha512. sha512 является под-версией SHA2. SHA2 еще не доказал, что он способен на атаку на столкновение, и sha512 будет генерировать 512-битный хэш. Вот пример использования sha512:

 <?php hash('sha512',$password); 

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

 <?php if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) { echo "CRYPT_BLOWFISH is enabled!"; }else { echo "CRYPT_BLOWFISH is not available"; } 

Если он вернет, что он включен, то следующий шаг будет легким. Все, что вам нужно сделать, чтобы выполнить шифрование пароля (обратите внимание, что для большей настраиваемости вам нужно это увидеть. Как вы используете bcrypt для хеширования паролей в PHP? ):

 crypt($password, $salt); 

Теперь, чтобы ответить на ваш второй вопрос. Соль обычно является случайной строкой, которую вы добавляете в конце всех своих паролей, когда вы их используете. Использование соли означает, что если кто-то получает вашу базу данных, они не могут проверить хеши для общих паролей. Проверка базы данных вызывается с использованием таблицы радуги. Вы всегда должны использовать соль при хешировании!

Вот мои доказательства уязвимостей атаки SHA1 и MD5:
http://www.schneier.com/blog/archives/2012/10/when_will_we_se.html , http://eprint.iacr.org/2010/413.pdf , http://people.csail.mit.edu/ yiqun / SHA1AttackProceedingVersion.pdf , http://conf.isi.qut.edu.au/auscert/proceedings/2006/gauravaram06collision.pdf и понимание слабости столкновений sha-1

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

Вместо того, чтобы предварительно вычислить одно «хэшированное» значение для каждого пароля открытого текста, злоумышленнику необходимо предварительно скомпилировать 16384 «хэшированные» значения для каждого пароля открытого текста (2 ^ 7 * 2 ^ 7).

Этот вид бледнеет сегодня, но был довольно большой, когда функция крипты была впервые разработана – вычислительная сила, чтобы предварительно вычислить, что многие пароли умножают количество подозрительного (словаря) обычного текста, которое вы подозреваете (словарь) было довольно высоким.

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

Если хэши, которые вы хотите сгенерировать, предназначены для паролей, это хорошо принятый метод его реализации.

http://www.openwall.com/phpass/

Если вы планируете сделать это для паролей, не используйте MD5 или SHA1 . Известно, что они слабые и небезопасные, даже с солью.

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

Нынешний алгоритм оптимальной обработки паролей – это BCrypt с подходящим солением.

И лучший способ реализовать хэширование паролей BCrypt в PHP – это использовать новый API паролей PHP. Этот API будет представлен как набор встроенных функций в следующей версии PHP, v5.5, который должен быть выпущен в ближайшие несколько месяцев. Хорошей новостью является то, что они также выпустили версию обратной совместимости для пользователей текущих версий PHP (5.3 и 5.4), поэтому, хотя PHP 5.5 еще не выпущен, вы можете сразу же начать использовать новый API.

Вы можете скачать библиотеку совместимости здесь: https://github.com/ircmaxell/password_compat

Также: вы спросили, что такое «соль». Поскольку я упоминал об этом пару раз в этом ответе, я должен рассмотреть и эту часть вопроса.

Соль – это в основном дополнительная строка, добавленная к паролю при его хэшировании, чтобы сделать его более трудным для взлома.

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

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

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

Надеюсь, это поможет.