Kontrolní součty pomocí MD5 a SHA1

Pro začátek si vypůjčím definici kontrolního součtu z Wikipedie:

Kontrolní součet je doplňková informace, která se předává spolu s vlastní informací a slouží k ověření, zda je vlastní informace úplná a zda při jejím přenosu nedošlo k chybě. Kontrolní součet je výsledkem nějaké předem určené operace, provedené s vlastní informací. Příjemce informace má možnost sám kdykoliv spočítat svůj vlastní kontrolní součet. Jakmile vypočtený kontrolní součet nesouhlasí s předaným kontrolním součtem, znamená to, že během přenosu došlo k poškození zprávy nebo k poškození kontrolního součtu.

Z definice také vyplývá použití – když si chcete rychle ověřit jestli dva soubory jsou stejné. To se hodí nejenom pro kontrolu, jestli nebyl soubor poškozen při přenosu, ale také když si chcete ověřit jestli dva stejně vypadající soubory na disku jsou opravdu ty samé nebo jestli vaše váš soubor je opravdu ten, za nějž se vydává. Existuje několik metod pro tvorbu těchto součtů. Na Internetu se nejčastěji setkáte s MD5 a SHA1. Když pomocí nich vytvořím kontrolní součty textu výše citované definice, budou vypadat takto:

SHA1: eb683281c095bb86659d1dc684b4053e8495fa3b
MD5:  f2a26fefbbeafade26ce10875c8d3fa9

Jak vidíte, jde o celkem krátké textové údaje. Podobně by vypadaly i kdybych vytvořil kontrolní součet daleko většího objemu dat. Tak například kontrolní součty pro ISO obraz linuxové distribuce Lubuntu 13.10 (696 MB) vypadají následovně:

SHA1: 10a2cd7e9a037a81248e0a777b7ed7da42525e11
MD5:  5e85e368b6eaf1b9f5cf88467c6570f5

Určitě už někoho z vás napadlo, že informace uložená v kontrolním součtu neobsahuje tolik dat, aby popsala celý soubor, pro který je součet spočítán. Je to pravda a proto se taky může stát, že různé soubory mohou mít stejné kontrolní součty. ALE není to problém. Algoritmy jsou navrženy tak, aby při velmi podobných vstupních datech byly výstupy velmi rozdílné a naopak. Takže pokud budou mít dva soubory stejné součty, budou na první pohled úplně jiné (např. malý textový soubor a obrovský archiv). Navíc soubory se stejným MD5 nebudou mít stejný SHA1 (nebo alespoň pravděpodobnost takové kolize je velmi blízká nule). Na druhou stranu, pokud vezmu v předchozím případě použitou definici z Wikipedie, a první výskyt písmene l nahradím 1 (tohoto si u některých fontů vůbec nevšimnete), budou se kontrolní součty od původních výrazně lišit (nahoře je vždy původní verze, dole upravená):

SHA1: eb683281c095bb86659d1dc684b4053e8495fa3b
SHA1: 264abc4ebbe813e704a1e2b3717809fd0d188fda
MD5: f2a26fefbbeafade26ce10875c8d3fa9
MD5: 0daa880e05a112eb67fdb8d6b8e4e5d5

Jak vidíte, nepatrná změna na vstupních datech se opravdu projevila výraznou změnou kontrolního součtu. Ve světě Open Source je dobrým zvykem udávat kontrolní součty ke stažitelným souborům. Má to svoji logiku. Jelikož se jedná o díla volně šiřitelná, je možné si je obstarat z více zdrojů a pokud si soubor (typicky program) stáhnete odjinud než z autorova serveru, je dobré ověřit si, jestli je opravdu tím, za co se vydává. (Toto souvisí i s mým varováním ohledně (ne)stahování systémových souborů z neoficiálních zdrojů v článku Fallout 2 + High Resolution Patch pod Windows 8/8.1.)

Aktualizováno 30. 12. 2020
Jak takový hash získat, popisuje článek: Jak ve Windows zjistit (nejen) MD5 hash souboru bez dalších programů.

Programů pro výpočet kontrolních součtů existuje celá řada. Pod Windows se mi osvědčil Rapid CRC Unicode Portable.

Opět, budu rád, když v diskuzi doporučíte další nástroje i pro jiné systémy.