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

Ответ

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

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

// Пример хеширования пароля в 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). Обратимо без ключа.
  • Шифрование — для секретности (передача платежных данных). Обратимо только с ключом.

Ответ 18+ 🔞

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

Хеширование — это как отпечаток пальца для данных. Взял что угодно, скормил функции, а она тебе выплюнула строчку фиксированной длины. Главный прикол — обратно не собрать. Ёпта, это односторонняя дорога. Используется, чтобы проверить, не сломалось ли что при передаче, или, что важнее, чтобы пароли в базах не светить. Сохраняешь не сам пароль, а его хеш, и потом просто сверяешь отпечатки.

// Вот так, например, пароль хешируешь
$hash = password_hash('myPassword123', PASSWORD_BCRYPT);
// А проверяешь — совпадает ли введённое с тем, что в базе лежит
$isValid = password_verify('myPassword123', $hash); // true

По хешу исходник не восстановишь, и слава богу. Иначе бы все базы взламывали за пять минут.

Кодирование — это вообще не про секретность, это чисто техническая штука. Представь, тебе нужно бинарные данные в текст превратить, чтобы в JSON или URL запихнуть. Берёшь Base64 — и вжух! Обратимое преобразование, никакого ключа, просто меняем представление. Любой, кто знает алгоритм, декодирует обратно.

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

Это как архивировать файл в ZIP — не спрятать, а упаковать для удобства.

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

// Допустим, шифруем что-то важное на AES
$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);

Перепутаешь ключ — и накрылся медным тазом, данные капут.

Короче, резюмирую, чтобы в голове отложилось:

  • Хеш — для проверки «а не обосрался ли я?». Пароль совпал? Файл цел? Необратимо.
  • Кодировка — для удобства «как бы это в письме переслать». Обратимо, ключ не нужен.
  • Шифрование — для секретности «чтоб враги не прочитали». Обратимо, но только с тем самым ключом.

Вот и вся магия. Главное — не использовать Base64 для «шифрования» паролей, а то сам от себя охуеешь, когда всё всплывёт.