Как хэшировать пароль в PHP?

Как выучить PHP Программирование и разработка

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

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

Заметили, что мы используем слово «хэш», а не «зашифровать» ? Это связано с тем, что хеширование и шифрование — очень разные процессы, которые часто путают.

Хеширование

Функция хеширования берет строку mypassword123и преобразует ее в зашифрованную версию строки, известную как хэш. Например, mypassword123может быть хеширован для получения случайной строки цифр и букв, такой как 9c87baa223f464954940f859bcf2e233. Хеширование — это односторонняя функция. Как только вы что-то хешируете, вы получаете строку фиксированной длины — процесс, который нельзя легко обратить вспять.

Мы можем сравнить два хэша, чтобы проверить, пришли ли они из одной и той же исходной строки. Позже в этой статье мы рассмотрим, как мы можем реализовать этот процесс с помощью PHP.

Шифрование

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

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

Salting

Пароли также должны быть солены перед хешированием. Соление — это действие по добавлению случайной строки к паролю перед его хешированием.

Читайте также:  Алгоритмы 101: как реализовать обход дерева в JavaScript

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

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

По состоянию на 2023 год рекомендуемые алгоритмы хеширования:

  • Argon2
  • Scrypt
  • bcrypt
  • PBKDF2

Хеширование с помощью PHP

Хеширование в PHP стало проще, начиная с PHP5.5 с введением этой password_hash()функции.

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

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

Проще говоря, стоимость хэша пароля относится к объему вычислений, необходимых для создания хэша. Это как мера того, насколько «сложно» создать хэш. Чем выше стоимость, тем сложнее.

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

Как мы можем прочитать в password_hash() документации :

…в него включена вся информация, необходимая для проверки хэша. Это позволяет password_verify()функции [ ] проверять хэш, не требуя отдельного хранилища для соли или информации об алгоритме.

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

На практике это выглядит так:

<?php
    $password = "sitepoint";

    $hashed_password = password_hash($password, PASSWORD_DEFAULT);

    if (password_verify($password, $hashed_password)) {
        //if the password entered matches the hashed password, we're in
    } else {
        // redirect to the homepage
    }

Более подробную информацию о password_hash()функции можно найти здесь , а здесь.password_verify()

Заключение

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

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

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

Оцените статью
bestprogrammer.ru
Добавить комментарий