Zabezpečování citlivých údajů v 21. století

Rozmohl se nám tu takový nešvar... Během týdne jsem obdržel hned dva e-maily s přílohou obsahující potencionálně citlivé údaje. V prvním případě v dokumentu bylo akorát pár osobních údajů, které se stejně válí v několik veřejně přístupných registrech, takže... ehm. V druhém případě v dokumentu už pár neveřejných údajů bylo, takže by to mělo smysl... kdyby provedení nebylo někdy z dob krále klacka. Takže si názorně ukážeme, jak zabezpečit citlivé údaje tak, že je to úplně k ničemu.

Oba e-maily mají společné totiž ještě dvě další věci. Za prvé - citlivý dokument je v zip souboru, který je zaheslovaný (což je to jediné zabezpečení). Za druhé - a to je ta horší část - heslo tvoří datum narození a tato skutečnost je v obou případech napsáno přímo v e-mailu s dokumentem. A už někde v téhle části začíná být jasné, že dostat se k dokumentu asi nebude úplně těžké. Jednak datum narození je jako heslo poměrně dost k ničemu, protože patrně adresát dokumentu nebude zdaleka jediný, který tento údaj ví. Ale dobře, vynecháme sociální inženýrství a zkusíme to dále technicky. Datum narození sestává z roku (4 číslice), měsíce (2 číslice) a dne (2 číslice). Dohromady tedy 8 čísel. Nicméně pokud se vlamujeme do cizího dokumentu, máme nejspíše i nějaké hrubé tušení, kolik danému člověku je let. Tedy už minimálně fakt, že daná osoba ještě žije, zredukuje první 4 číslice na řádově 100 čísel (když budeme hledat od novorozenců po 100 leté lidi). Měsíců je 12, to také není úplně příliš. A každý měsíc může mít maximálně 31 dnů. Když to tedy shrnu, hledáme 8 místné číslo s takovými omezeními, že daných kombinací příliš nebude. Ale jdeme dál, stejně chceme vyzkoušet, jak opravdu těžké je se k tomu dostat...

Potřebujeme tedy napřed nástroj na hledání hesel. Po chvíli hledání (řádově sekundy) nacházím fcrackzip. Ten umí různé věci, hledat hesla násilně, ... Ale to nás příliš nezajímá; když máme takhle jasnou představu, jak heslo vypadá, je zbytečné zkoušet všechny. fcrackzip nicméně umí zkoušet hesla ze slovníku. To je potencionálně zajímavé. Takže teď potřebujeme jen sestavit slovník možných hesel na základě podmínek výše. Takže asi po 5 minutách práce (včetně hledání dokumentace, jak se zase open with přesně používá... takže někdo, kdo v Pythonu píše něco častěji, to napíše ještě rychleji) máme tenhle script:

  1. #!/usr/bin/python3
  2.  
  3. with open('zipdict.txt', 'w') as f:
  4.     for year in range(1930, 2003):
  5.         for month in range(1, 13):
  6.             for day in range(1, 32):
  7.                 f.write('%04d%02d%02d\n' % (year, month, day))
Má pár řádků, napsat jej trvá doopravdy chvíli. Není dokonalý, protože generuje i hesla s nesmysly typu 30. únor, ale jak si hned ukážeme - je to úplně jedno (vyloučit nesmysly by bylo pracnější, než je stejně zkusit). Slovník hesel vygenerovaný tedy pro lidi narozené mezi léty 1930 a 2001 obsahuje zhruba 27.000 hesel. Tak zkusíme, jak dlouho bude trvat mezi nimi to správné:
  1. fcrackzip -u -D -p zipdict.txt sifrovany_soubor.zip
Mačkám enter a... heslo je na světě. Takže na obyčejném, výkonově nijak nevyčuhujícím, 3 roky starém notebooku, najít správné heslo (po opakovaném spuštění a měření) trvalo... 0,2 sekundy. Takže dokument s tak citlivými údaji, že je bylo potřeba chránit, jsme zašifrovali tak silným heslem, že jej půlka cizích lidí stejně zná a ta druhá půlka při elementární znalosti výpočetní techniky si jej do minuty zjistí na jakémkoliv vybavení, které se kde válí. A jediným efektem je, že oprávněný každý oprávněný adresát je otravován zadáváním hesla (a hledáním občanky, když si to sám nepamatuje :-) ) a odesílatel pravděpodobně zdržován zbytečným zamykáním každého dokumentu (aneb po vidině tohohle moc nevěřím, že by to někdo automatizoval). Bravo :-) Ideální sofistikovaného řešení zabezpečení 21. století :-)