Проверка целостности
Хеши помогают убедиться, что файл скачался полностью и его никто не подменил по дороге.
Контрольная сумма файла
Когда ты скачиваешь программу, рядом часто публикуют её хеш (контрольную сумму). Скачав файл, ты считаешь его хеш сам и сравниваешь с опубликованным. Совпало — файл целый и не повреждён. Не совпало — где-то ошибка или подмена.
import hashlib
# имитируем содержимое скачанного файла
file_data = b"important program bytes v1.0"
published_hash = hashlib.sha256(b"important program bytes v1.0").hexdigest()
our_hash = hashlib.sha256(file_data).hexdigest()
print("Опубликованный хеш:", published_hash[:16], "...")
print("Наш хеш: ", our_hash[:16], "...")
print("Файл целый:", published_hash == our_hash)Вывод:
Опубликованный хеш: 5c2b8a... ... Наш хеш: 5c2b8a... ... Файл целый: True
Что будет при повреждении
Изменим в файле хотя бы один байт — и хеш перестанет совпадать. Это сразу выдаст подмену:
import hashlib
original = b"important program bytes v1.0"
tampered = b"important program bytes v2.0" # враг подменил версию
h_orig = hashlib.sha256(original).hexdigest()
h_tamp = hashlib.sha256(tampered).hexdigest()
print("Совпадают хеши:", h_orig == h_tamp)
if h_orig != h_tamp:
print("ВНИМАНИЕ: файл изменён, доверять нельзя!")Вывод:
Совпадают хеши: False ВНИМАНИЕ: файл изменён, доверять нельзя!
А если подменят и файл, и хеш?
Простая контрольная сумма защищает от случайных повреждений, но хитрый враг может подменить и файл, и опубликованный хеш. Чтобы защититься от этого, используют HMAC — хеш с секретным ключом. Без ключа подделать правильный HMAC невозможно.
import hmac, hashlib
secret_key = b"shared-secret"
message = b"Перевести 100 рублей Бобу"
tag = hmac.new(secret_key, message, hashlib.sha256).hexdigest()
print("HMAC-метка:", tag[:16], "...")
# получатель проверяет с тем же ключом
ok = hmac.compare_digest(
tag,
hmac.new(secret_key, message, hashlib.sha256).hexdigest()
)
print("Сообщение подлинное:", ok)Вывод:
HMAC-метка: 4e8f1c2a9b... ... Сообщение подлинное: True
Зачем это нужно
HMAC одновременно подтверждает две вещи: сообщение не изменили (целостность) и его отправил тот, кто знает ключ (подлинность). Именно HMAC применяется внутри HTTPS и многих API, чтобы убедиться, что запрос не подделали.
Используйhmac.compare_digestдля сравнения меток — обычное==может выдать секрет по времени сравнения.