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

«Что такое хеширование?» — вопрос из категории Алгоритмы и структуры данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Критически важные свойства криптографических хеш-функций:

  1. Детерминированность: Один и тот же вход всегда дает одинаковый хеш.
  2. Быстрота вычисления: Хеш от данных вычисляется за приемлемое время.
  3. Необратимость (стойкость к прообразу): По значению хеша практически невозможно восстановить исходные данные.
  4. Устойчивость к коллизиям: Крайне мала вероятность, что два разных входа дадут одинаковый хеш.
  5. Лавинный эффект: Малейшее изменение во входных данных (один бит) полностью меняет выходной хеш.

Применение в разработке на PHP:

  • Хранение паролей: Никогда не храните пароли в открытом виде или с использованием устаревших функций (md5, sha1). Используйте password_hash() и password_verify().
    
    // Безопасное хеширование пароля
    $plainPassword = 'mySecretPass123!';
    $hash = password_hash($plainPassword, PASSWORD_DEFAULT); // Использует bcrypt или argon2i
    // $hash выглядит как: '$2y$10$...' и содержит соль (salt) и параметры алгоритма.

// Сохраняем $hash в базу данных.

// Проверка пароля при логине $userInputPassword = $_POST['password']; $hashFromDb = '...'; // Получаем из БД if (password_verify($userInputPassword, $hashFromDb)) { // Пароль верный if (password_needs_rehash($hashFromDb, PASSWORD_DEFAULT)) { // Если параметры алгоритма устарели, перехешируем и обновляем в БД. $newHash = password_hash($userInputPassword, PASSWORD_DEFAULT); // save $newHash to DB } } else { // Неверный пароль }


*   **Проверка целостности данных:** Хеш-суммы файлов (например, `md5_file()`, `sha1_file()`) для проверки, что файл не был поврежден при передаче.
*   **Структуры данных:** Хеш-таблицы (в PHP — ассоциативные массивы) используют хеш-функцию для быстрого доступа к элементам по ключу.
*   **Цифровые подписи и HMAC:** Для проверки подлинности и целостности сообщений.