Ответ
Ключевое различие — обратимость операции. Хеширование — односторонний процесс, а шифрование — двусторонний.
Хеширование (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()}")
Итог: Хеширование доказывает, что данные не изменились, а шифрование скрывает содержимое данных.