×

Дополнительные материалы бесплатно предоставляются только зарегистрированным пользователям.

Для скачивания исходных файлов необходимо войти под своим аккаунтом через форму на главной панели.

Для тех кто не зарегистрирован, можно это сделать на вкладке Регистрация.

  • Рубрики
  • Слайдер
  • Сайдбар
  • Подписка
  • Вниз
  • Вверх
×
  • Как сделать сайт с нуля своими руками (вводная часть)

    1. Причины создания пошаговой инструкции по разработке самописного сайта
    2. Тема создаваемого сайта
    3. В чем будет заключаться монетизация
    4. Функционал
    5. Этапы создания
    6. Текущее состояние создаваемого сайта

    Здравствуйте уважаемый посетитель!

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

    Причем чтобы такой интернет-ресурс был создан не на каком-нибудь стандартном шаблоне бесплатной СMS (Content management system - система управления контентом) типа WordPress, Drupal, Joomla и т.п., а заточенный под себя, с возможностью обеспечить ему должную безопасность и реализовать все свои индивидуальные потребности.

    Часто такие сайты, созданные под конкретные задачи на основе языка разметки веб-страниц HTML, стилей CSS и других инструментов веб-программирования (PHP, JavaScript и т.п.), называют самописными.

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

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

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

Самописный сайт своими руками!

Текущее состояние создаваемого сайта

Здесь можно посмотреть текущее состояние тестового самописного сайта, который создается в рамках цикла статей Сделай сайт с нуля своими руками.

Где в дополнительных материалах можно бесплатно скачать исходные файлы сайта с таблицами MySQL.

Вы здесь: Главная → Сборник статей → Формы → Практические примеры использования в PHP криптографических хеш-функций


Автор: / Дата:

Практические примеры использования в PHP криптографических хеш-функций

Здравствуйте уважаемый посетитель!

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

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

В частности, будет рассмотрен вариант использования функции crypt() с Blowfish-шифрованием и добавлением к параметру алгоритма "Blowfish автоматически генерированной уникальной "соли". Данный метод создания хеша ранее был применен при создании скрипта для отправки формы онлайн заказа.

В качестве второго варианта будет приведен пример использования встроенного API хеширования паролей (API - интерфейс прикладного программирования, англ. application programming interface) .

В котором сначала одной из функций API password_hash() будет создан хеш пароля, а затем другой функцией password_verify() будет проведена проверка на соответствие хеша вновь введенному паролю.

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

Содержание


  • Использование функции crypt()
  • Создание хеша функцией password_hash()
  • Проверка на соответствие хеша паролю при помощи функции password_verify()
  • Исходные файлы сайта

Использование функции crypt()


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

скриншот 36

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

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

  1. <?php

  2. //Вычисление хэша с помощью функции crypt()

  3. $password = 'Z5nC89';

  4. $start_time = microtime(true);

  5. //$salt = substr(sha1(mt_rand()),6,22);

  6. $salt = bin2hex(openssl_random_pseudo_bytes(11));

  7. $hash = crypt($password, '$2y$10$'.$salt.'$');

  8. $delta_time = microtime(true) - $start_time;

  9. $cash_time = round($delta_time * 1000000, 0).'мкс.';

  10. echo nl2br('crypt(): пароль - '.$password.', соль - '.$salt.', хеш - '.$hash.', время вычисления - '.$cash_time."\n");

  11. ?>

Рис.1 Вычисление хэша с помощью функции crypt()

Алгоритм выполнения функции crypt() (поз.7) определяется вторым ее параметром. Где в первой его части префиксом $2y$ задается вид шифрования Blowfish, вторые две цифры между символами $ определяют количество интераций (в данном случае 2^10 = 1024), а остальные 22 символа между $ назначают соль, с использованием которой будет происходить преобразование.

При формировании соли $salt здесь приведено два варианта. Первый - тот, который использовался ранее с генерацией функцией mt_rand() случайного числа с дальнейшим получением из него sha1-хэша и извлечением с помощью substr() строки в 22 символа (поз.5). Где 22 символа, это условие, которое допускается указывать при определении соли в параметрах функции crypt() в случае использовании шифрования Blowfish.

Дополнительно приведен и второй способ получения соли с использованием другой генерирующей функции - openssl_random_pseudo_bytes(), на выходе которой формируется псевдослучайная последовательность из 11-ти байт. После чего полученные бинарные данные с применением функции bin2hex() преобразуются в шестнадцатеричное представление с нужной 22-ти символьной строкой (поз.6).

Один из вариантов, в данном случае первый (поз.5), закомментирован. Так что проверка создания хеша будет проводиться с использованием функции openssl_random_pseudo_bytes(), которая ранее нами не применялась.

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

Для увеличения / уменьшения размера изображения кликните по картинке
Результат получения хеша с помощью функции crypt()

Рис.2 Результат получения хеша с помощью функции crypt()

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

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

Ниже показан код, с помощью которого используя crypt() можно сделать такую проверку.

  1. <?php

  2. //Проверка на соответствие хеша паролю с помощью функции crypt()

  3. $password = 'Z5nC89';

  4. $new_salt = substr($hash, 0, 29 );

  5. $new_hash = crypt($password, $new_salt.'$');

  6. echo nl2br('пароль - '.$password.', соль с префиксом $2y$ и весовым параметром интераций - '.$new_salt.', новый хеш - '.$new_hash."\n\n");

  7. if ($hash == $new_hash) {

  8. echo 'Пароль правильный';

  9. }

  10. else {

  11. echo 'Пароль неправильный';

  12. }

  13. ?>

Рис.3 Проверка на соответствие хеша паролю с помощью функции crypt()

Здесь с помощью оператора сравнения if (поз.7) производится проверка хеша, находящегося в базе данных в виде переменной $hash с хешем, сформированным при проверке введенного пароля $new_hash.

И при сравнении значений hash и $new_hash выполняются соответствующие алгоритмы авторизации пользователей. В данном случае выводятся сообщения о вводе правильного или неправильного пароля (поз.8,11).

При этом соль, необходимая для вычисления нового значения хеша $new_hash, вместе с префиксом $2y$ и весовым параметром интераций, формируется из хеша, ранее сохраненного в базе данных hash, путем извлечения из него с помощью функции substr() из первых 29-ти символов (поз.4). Что соответствует тому же значению второго параметра функции, которое использовалось ранее при создании хеша (поз.7, рис.1).

А само значения хеша, соответствующего вновь введенному паролю, формируется функцией crypt() с использованием соответствующих параметров (поз.5).

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

Для увеличения / уменьшения размера изображения кликните по картинке
Результат проверки на соответствие с использованием функции crypt() при правильном вводе пароля

Рис.4 Результат проверки на соответствие с использованием функции crypt() при правильном вводе пароля

Как видно, в этом случае вновь созданный хеш совпадает с хешем, сохраненным в базе данных. Что означает - пароль правильный.

Если попробовать изменить пароль (заменим, например, предпоследний символ 8 на 2), то проверка должна показать на несоответствие его ранее сохраненному хешу.

Для увеличения / уменьшения размера изображения кликните по картинке
Результат проверки на соответствие с использованием функции crypt() при неправильном вводе пароля

Рис.5 Результат проверки на соответствие с использованием функции crypt() при неправильном вводе пароля

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

Таким образом мы рассмотрели создание хеша и проверку на соответствие введенного пароля при варианте использования функции crypt(). А теперь рассмотрим более современный и простой в применении способ, основанный на использовании функций API хеширования паролей, которые, как ранее было отмечено, доступны в PHP с версией 5.5 и выше.

Создание хеша функцией password_hash()


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

скриншот 38

Вообще функция password_hash() поддерживает несколько алгоритмов и совместима с ранее рассмотренной crypt(). Например, можно используя password_hash() создать хеш с аналогичными параметрами алгоритма шифрования Blowfish, которые мы использовали в предыдущем примере.

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

Дело в том, что при использовании в password_hash() алгоритма по умолчанию с автоматически генерируемой солью, создание хеша и проверка пароля на соответствие выполняется всего лишь одной строкой кода.

Ниже показан код использования такого варианта. Где видно, что для создания хеша достаточно в качестве параметров функции password_hash() указать лишь значение исходного пароля и алгоритм шифрования по умолчанию.

  1. <?php

  2. //Вычисление хэша с помощью функции password_hash()

  3. $password = 'Z5nC89';

  4. $start_time = microtime(true);

  5. $hash = password_hash($password, PASSWORD_DEFAULT);

  6. $delta_time = microtime(true) - $start_time;

  7. $cash_time = round($delta_time * 1000000, 0).'мкс.';

  8. echo nl2br('password_hash(): пароль - '.$password.', хеш - '.$hash.', время вычисления - '.$cash_time."\n");

  9. ?>

Рис.6 Вычисление хеша с помощью функции password_hash()

Наверное, проще не придумаешь. Всего одно действие, и хеш создан. Теперь снова обновим страницу и посмотрим на результат.

Для увеличения / уменьшения размера изображения кликните по картинке
Результат получения хеша с помощью функции password_hash()

Рис.7 Результат получения хеша с помощью функции password_hash()

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

Таким образом с помощью функции password_hash() хеш мы создали, и теперь осталось сделать проверку на соответствие ему вновь введенного пароля.

Проверка на соответствие хеша паролю при помощи функции password_verify()


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

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

  1. <?php

  2. //Проверка на соответствие хеша паролю с помощью функции password_verify()

  3. $password = 'Z5nC89';

  4. echo nl2br('Проверка функцией password_verify: пароль - '.$password.', хеш - '.$hash."\n\n");

  5. if (password_verify($password , $hash)) {

  6. echo 'Пароль правильный';

  7. }

  8. else {

  9. echo 'Пароль неправильный';

  10. }

  11. ?>

Рис.8 Проверка на соответствие хеша паролю с помощью функции password_verify()

Как видно, такой вариант проверки достаточно прост. Всего одно действие, где с помощью условного оператора if определяется, соответствуют ли друг другу пароль в виде переменной $password и проверяемый хеш $hash.

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

Для увеличения / уменьшения размера изображения кликните по картинке
Результат проверки  функцией password_verify() при правильном вводе пароля

Рис.9 Результат проверки функцией password_verify() при правильном вводе пароля

Как видно, в случае когда пароли и хеш совпадает, то и результат проверки соответствующий - пароль правильный.

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

Для увеличения / уменьшения размера изображения кликните по картинке
Результат проверки  функцией password_verify() при неправильном вводе пароля

Рис.10 Результат проверки функцией password_verify() при неправильном вводе пароля

Данный пример подтверждает корректную работу password_verify() и в случае ввода неправильного пароля.


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

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

Исходные файлы сайта


Знак папкиИсходные файлы сайта с обновлениями, которые были сделаны в данной статье, можно скачать из прилагаемых дополнительных материалов:

  • Файлы каталога www
  • Таблицы базы данных MySQL

При этом, временно сформированные в данной статье PHP-скрипты, размещенные в файле "main.php" папки "articles" корневого каталога, закомментированы. Для проверки рассмотренных здесь примеров, следует раскомментировать соответствующие фрагменты кода.

Дополнительные материалы бесплатно предоставляются только зарегистрированным пользователям.

Для скачивания исходных файлов необходимо войти под своим аккаунтом через форму на главной панели.

Для тех кто не зарегистрирован, можно это сделать на вкладке Регистрация.

С уважением, Николай Гришин


Комментарии


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

Буду Вам за это очень признателен!

comments powered by HyperComments