← Назад к вопросам

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

1.3 Junior🔥 241 комментариев
#Безопасность

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Различия между хешированием, кодированием и шифрованием

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

Кодирование (Encoding)

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

  • Цель: Универсальная читаемость, компактность представления, совместимость систем.
  • Ключевые свойства: Обратимость, отсутствие секретности, использование публичных алгоритмов.
  • Примеры в PHP:
// Base64 Encoding - часто используется для передачи бинарных данных в текстовом формате (например, в email или JSON)
$originalString = "Hello, World!";
$encodedString = base64_encode($originalString);
echo $encodedString; // Вывод: SGVsbG8sIFdvcmxkIQ==

$decodedString = base64_decode($encodedString);
echo $decodedString; // Вывод: Hello, World! (полностью обратим)

// URL Encoding (percent-encoding)
$url = "https://example.com/search?q=PHP & MySQL";
$encodedUrl = urlencode($url);
echo $encodedUrl; // https%3A%2F%2Fexample.com%2Fsearch%3Fq%3DPHP+%26+MySQL

Шифрование (Encryption)

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

  • Цель: Секретность, защита данных от чтения неавторизованными лицами.
  • Ключевые свойства: Обратимость (при наличии ключа), зависимость от ключа, наличие алгоритмов с симметричными и асимметричными ключами.
  • Примеры в PHP:
// Симметричное шифрование (один ключ для шифрования и дешифрования) с использованием OpenSSL
$plaintext = "Секретная информация";
$key = openssl_random_pseudo_bytes(32); // Секретный ключ
$method = 'aes-256-cbc';

// Шифрование
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method));
$ciphertext = openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv);

// Дешифрование (требуется тот же ключ и IV)
$decrypted = openssl_decrypt($ciphertext, $method, $key, OPENSSL_RAW_DATA, $iv);
echo $decrypted; // Вывод: Секретная информация

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

Хеширование (Hashing)

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

  • Цель: Проверка целостности, верификация данных (без возможности восстановления оригинала), хранение паролей.
  • Ключевые свойства: Необратимость, фиксированный размер выходных данных (даже для разных входов), чувствительность к изменениям (коллизии должны быть крайне редки).
  • Примеры в PHP:
// Хеширование пароля с использованием современного алгоритма bcrypt (через password_hash())
$password = "user_password_123";
$hash = password_hash($password, PASSWORD_DEFAULT); // Алгоритм выбирается автоматически (bcrypt или argon2)
echo $hash; // Вывод: например, $2y$10$... (уникальная строка, которую нельзя обратить в пароль)

// Проверка пароля (верификация)
$isValid = password_verify($password, $hash); // Возвращает true/false
// Никакого "дехеширования" не происходит! Мы просто проверяем, дает ли новый хеш тот же результат.

// Хеширование для целостности данных (например, файла)
$fileContent = file_get_contents('important_document.pdf');
$fileHash = hash('sha256', $fileContent); // SHA-256 дает хеш длиной 64 символа
echo $fileHash; // Уникальная контрольная сумма файла. Если файл изменится на 1 бит, хеш полностью изменится.

Сводная таблица ключевых различий

КритерийКодированиеШифрованиеХеширование
Основная цельУдобство передачи/храненияОбеспечение конфиденциальностиПроверка целостности / хранение паролей
ОбратимостьПолностью обратимоОбратимо при наличии ключаНЕ обратимо (односторонняя функция)
КлючНе требуетсяОбязательно требуетсяНе требуется (для верификации паролей используется "соление")
ПримерыBase64, URL, UTF-8AES (симметричное), RSA (асимметричное)bcrypt, Argon2, SHA-256
Использование в PHP BackendAPI ответы в JSON, передача файловЗащита данных в БД (например, платежной информации)Хранение паролей пользователей (никогда не шифровать пароли!), проверка цифровых подписей

Критически важное правило для backend-разработчика

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