Чем отличаются хеширование от кодирования и шифрования?

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

Ответ

Это три принципиально разных процесса преобразования данных.

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

// Пример хеширования пароля в PHP
$hash = password_hash('myPassword123', PASSWORD_BCRYPT);
// Проверка пароля
$isValid = password_verify('myPassword123', $hash); // true

Кодирование (например, Base64, URL-encoding) — это обратимое преобразование данных в другой формат для удобства передачи или хранения. Оно не предназначено для обеспечения конфиденциальности.

$encoded = base64_encode('Hello World'); // SGVsbG8gV29ybGQ=
$decoded = base64_decode($encoded); // Hello World

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

// Пример симметричного шифрования (AES) в PHP
$key = openssl_random_pseudo_bytes(32); // 256-битный ключ
$iv = openssl_random_pseudo_bytes(16); // Вектор инициализации
$ciphertext = openssl_encrypt('Sensitive Data', 'aes-256-cbc', $key, 0, $iv);
$plaintext = openssl_decrypt($ciphertext, 'aes-256-cbc', $key, 0, $iv);

Кратко:

  • Хеш — для проверки (пароль, целостность файла). Необратим.
  • Кодирование — для изменения формата (передача в URL, JSON). Обратимо без ключа.
  • Шифрование — для секретности (передача платежных данных). Обратимо только с ключом.