PHP - Хеширование: Пособие для начинающих

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

PHP - Hashing

Что такое хеширование?

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

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

Применение хеширования

Теперь вы можете задаться вопросом: "Зачем нам нужно хеширование?" Отличный вопрос! Хеширование имеет множество применений в мире компьютинга. Давайте рассмотрим некоторые из них:

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

  2. Целостность данных: Хеширование может проверить, был ли файл изменен. Если даже один байт изменится, весь хеш будет другим!

  3. Цифровые подписи: Они используют хеширование для обеспечения подлинности цифровых документов.

  4. Кэширование: Large websites use hashing to quickly retrieve cached data (Перевод этой части sentences не ясен, поэтому я оставлю原文).

Процесс хеширования

Давайте разберем процесс хеширования на простые шаги:

  1. Возьмите входной данные (например, пароль).
  2. Примените к нему хеш-алгоритм.
  3. Получите фиксированный размер вывода (хеш).

Вот интересная часть: неважно, насколько длинным или коротким является ваш входной данные, вывод (хеш) всегда будет одинаковой длины для данного алгоритма.

Хеш-алгоритмы в PHP

PHP поддерживает несколько хеш-алгоритмов. Давайте рассмотрим некоторые из самых распространенных:

  1. MD5 (Message Digest algorithm 5)
  2. SHA-1 (Secure Hash Algorithm 1)
  3. SHA-256 (часть семьи SHA-2)
  4. Bcrypt (особенно хорош для паролей)

Каждый из них имеет свои сильные стороны и случаи использования. Например, bcrypt специально разработан для хеширования паролей и более безопасен, чем MD5 или SHA-1 для этой цели.

Хеш-функции в PHP

Теперь давайте脏手 с реальным кодом PHP! PHP предоставляет несколько встроенных функций для хеширования. Вот таблица самых commonly used:

Функция Описание
md5() Вычисляет хеш MD5 строки
sha1() Вычисляет хеш SHA-1 строки
hash() Генерирует хеш-значение с использованием различных алгоритмов
password_hash() Создает хеш пароля (рекомендуется для паролей)
crc32() Вычисляет полином CRC32 строки

Давайте рассмотрим примеры использования этих функций:

1. Хеширование MD5

$string = "Hello, World!";
$md5_hash = md5($string);
echo "MD5 hash of '$string': " . $md5_hash;

Вывод:

MD5 hash of 'Hello, World!': 65a8e27d8879283831b664bd8b7f0ad4

В этом примере мы используем функцию md5() для хеширования строки "Hello, World!". Результатирующий хеш всегда 32 символа в длину, независимо от длины входного данные.

2. Хеширование SHA-1

$string = "PHP is awesome!";
$sha1_hash = sha1($string);
echo "SHA-1 hash of '$string': " . $sha1_hash;

Вывод:

SHA-1 hash of 'PHP is awesome!': 4eb40c4bde4d39f32ab9064ec9c93396f6fdcf9f

Функция sha1() работает аналогично md5(), но производит 40-символьный хеш.

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

Функция hash() более универсальна, позволяя вам указывать, какой алгоритм использовать:

$string = "Hashing is fun!";
$algorithms = ['md5', 'sha1', 'sha256'];

foreach ($algorithms as $algo) {
$hash = hash($algo, $string);
echo "Hash of '$string' using $algo: " . $hash . "\n";
}

Вывод:

Hash of 'Hashing is fun!' using md5: 4d6b94ef062847891a1e97a716541059
Hash of 'Hashing is fun!' using sha1: 8a7ced2e4a8d64daa28566150c2add1c04812e53
Hash of 'Hashing is fun!' using sha256: 7b1b6d4c6e48183f2b1b3f2847736fb93339f45e254cb21330f3d0adc3e6d3db

Этот пример показывает, как разные алгоритмы производят разные длины и значения хешей для одного и того же входного данные.

4. Хеширование паролей

Для хеширования паролей рекомендуется использовать функцию password_hash():

$password = "mySecurePassword123";
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
echo "Hashed password: " . $hashed_password;

Вывод:

Hashed password: $2y$10$6Q5DYfJKCsa7C/eV4Wh9OeDjTJ0XLB.Vr7F1C5E6kJRBVWPwMDKP.

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

Для проверки пароля против его хеша используйте password_verify():

$password = "mySecurePassword123";
$hashed_password = password_hash($password, PASSWORD_DEFAULT);

if (password_verify($password, $hashed_password)) {
echo "Password is correct!";
} else {
echo "Password is incorrect.";
}

Вывод:

Password is correct!

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

Заключение

Поздравления! Вы только что сделали свои первые шаги в мир хеширования с PHP. Помните, хеширование - это单向ный процесс - вы не можете "развернуть" хеш, чтобы получить исходный входной данные. Именно это делает его таким полезным для целей безопасности.

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

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

Credits: Image by storyset