Чем принципиально отличается хеширование от шифрования?

Ответ

Ключевое различие — обратимость операции. Хеширование — односторонний процесс, а шифрование — двусторонний.

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

  • Цель: Проверка целостности и подлинности данных.
  • Процесс: Необратимый (односторонний). Из хеша невозможно восстановить исходные данные.
  • Результат: Хеш-сумма (или дайджест) — строка фиксированной длины, уникальная для входных данных. Даже небольшое изменение в данных кардинально меняет хеш.
  • Примеры использования:
    • Хранение паролей (в базе хранится хеш, а не сам пароль).
    • Проверка целостности файлов (контрольные суммы MD5, SHA-256).
    • Цифровые подписи.

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

  • Цель: Обеспечение конфиденциальности данных.
  • Процесс: Обратимый (двусторонний). Данные, зашифрованные с помощью ключа, могут быть расшифрованы (дешифрованы) с помощью того же или парного ключа.
  • Результат: Шифротекст (ciphertext), длина которого обычно зависит от длины исходных данных.
  • Примеры использования:
    • Передача конфиденциальных данных по сети (HTTPS, TLS).
    • Шифрование файлов на диске (Full Disk Encryption).
    • Защищенные мессенджеры.
import hashlib
from cryptography.fernet import Fernet

# --- Хеширование ---
password = b"my_secret_password"
# Получаем хеш пароля. Восстановить 'password' из 'hashed_password' невозможно.
hashed_password = hashlib.sha256(password).hexdigest()
print(f"Hashed: {hashed_password}")

# --- Шифрование ---
key = Fernet.generate_key() # Ключ для шифрования и дешифрования
cipher_suite = Fernet(key)

secret_message = b"This is a secret message."
# Шифруем сообщение. Его можно будет расшифровать, зная ключ.
cipher_text = cipher_suite.encrypt(secret_message)
print(f"Encrypted: {cipher_text}")

# Расшифровываем обратно, используя тот же ключ
original_message = cipher_suite.decrypt(cipher_text)
print(f"Decrypted: {original_message.decode()}")

Итог: Хеширование доказывает, что данные не изменились, а шифрование скрывает содержимое данных.