Проверка целостности

Хеши помогают убедиться, что файл скачался полностью и его никто не подменил по дороге.

Контрольная сумма файла

Когда ты скачиваешь программу, рядом часто публикуют её хеш (контрольную сумму). Скачав файл, ты считаешь его хеш сам и сравниваешь с опубликованным. Совпало — файл целый и не повреждён. Не совпало — где-то ошибка или подмена.

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 для сравнения меток — обычное == может выдать секрет по времени сравнения.
Проверьте себя
1. Как контрольная сумма (хеш) помогает при скачивании файла?
AУскоряет загрузку
BПозволяет проверить, что файл не повреждён и не подменён, сравнив хеши
CШифрует файл
DСжимает файл
2. Чем HMAC отличается от обычного хеша файла?
AHMAC короче
BHMAC использует секретный ключ, поэтому без ключа метку не подделать
CHMAC обратим
DHMAC не использует хеш-функцию
Поддержать проект