Ako dať na archív heslo, ktoré niečo znamená
Keď na archív dáte heslo, predpokladáte, že bez neho sa k obsahu nikto nedostane. Pri ZIP-e to nemusí platiť. Formát ZIP totiž v praxi pozná dva úplne odlišné spôsoby šifrovania a rozdiel medzi nimi je rozdiel medzi „zamknuté" a „vyzerá zamknuté". Jeden z nich má publikovaný útok z roku 1994 a hotové nástroje, ktoré ho vykonajú. Druhý je AES-256. Dialógové okno vám pritom obidva ponúkne rovnako nenápadne.
Tento text hovorí o tom, ako rozoznať jedno od druhého, ako v 7-Zipe nastaviť to správne, čo vlastne skrýva voľba na šifrovanie názvov súborov a ako heslo doručiť tak, aby celá práca nebola zbytočná.
Staré ZIP šifrovanie je prelomené a nie je to novinka
Pôvodné šifrovanie v ZIP-e sa v špecifikácii PKWARE volá traditional PKWARE encryption, nástroje mu hovoria ZipCrypto alebo legacy encryption, WinZip Zip 2.0. Je to prúdová šifra: z hesla si vyrobí vnútorný stav (tri 32-bitové čísla), z neho generuje prúd bajtov a ten XOR-uje s obsahom súboru.
Eli Biham a Paul Kocher publikovali v roku 1994 na workshope Fast Software Encryption prácu A Known Plaintext Attack on the PKZIP Stream Cipher. Ide o útok so známym otvoreným textom (known-plaintext attack). Útočník nepotrebuje heslo hádať. Potrebuje kúsok obsahu, o ktorom vie, ako vyzerá nezašifrovaný.
Koľko toho potrebuje, je nepríjemne málo. Podľa dokumentácie nástroja bkcrack, ktorý tento útok implementuje, stačí 12 alebo viac bajtov známeho otvoreného textu, z toho aspoň 8 súvislých. Útok potom nezískava heslo, ale priamo vnútorný stav generátora — a ten podľa tej istej dokumentácie stačí na dešifrovanie celého daného súboru aj ostatných položiek v archíve, ktoré boli zašifrované rovnakým heslom.
V praxi to znamená: ak je v archíve okrem citlivého dokumentu aj firemné logo, ktoré má útočník z vášho webu, alebo hocijaký súbor, ktorého kópiu vie zohnať, potrebné bajty má. Jedno háklivé miesto tam je — kompresia. Dokumentácia bkcrack upozorňuje, že pri zbalenej položke treba poznať bajty až po kompresii, takže útočník musí kompresiu zopakovať rovnakým spôsobom; pri položkách uložených bez kompresie odpadá aj toto. Dĺžka hesla je pri tomto útoku bezvýznamná — 40-znakové heslo padne rovnako ako „1234". A pozor, prúdová šifra je pritom použitá tak, ako bola navrhnutá; problém je v samotnej konštrukcii šifry.
K tomu ešte kontrola integrity. WinZip vo svojej dokumentácii k AES uvádza, že Zip 2.0 používa na detekciu úmyselnej zmeny zašifrovaných dát hodnotu CRC, čo sa nedá považovať za kryptograficky silné. AES varianta na to používa autentizačný kód založený na HMAC-SHA1-80.
Čo znamená AES-256 v archíve
Špecifikácia ZIP-u od PKWARE (APPNOTE) zaviedla silné šifrovanie ako samostatnú vec: súbor šifrovaný pomocou AES vyžaduje verziu formátu 5.1, zatiaľ čo traditional PKWARE encryption si vystačí s verziou 2.0. Podporované sú kľúče 128, 192 a 256 bitov; WinZip vo svojej špecifikácii výslovne píše, že iné dĺžky kľúča povolené nie sú.
Heslo samo osebe kľúčom nie je. 7-Zip pri formáte 7z podľa vlastnej dokumentácie odvodzuje 256-bitový kľúč z textového hesla funkciou postavenou na SHA-256 a používa pri tom veľký počet iterácií práve preto, aby predražil vyskúšanie všetkých hesiel hrubou silou. Toto je dôvod, prečo pri AES archíve dĺžka hesla naozaj rozhoduje — útočník už nemá skratku a musí skúšať heslá jedno po druhom.
Ako nastaviť AES-256 v 7-Zipe
7-Zip na svojej stránke uvádza AES-256 pre 7z aj ZIP. Háčik je v tom, že to nie je predvolené. V nápovede 7-Zipu je pre formát zip pri parametri em= (na príkazovom riadku -mem=) uvedený zoznam ZipCrypto, AES128, AES192, AES256 a ako predvolená hodnota ZipCrypto. Kto teda v 7-Zipe spraví ZIP s heslom a nič neprepne, dostane presne to šifrovanie, o ktorom je predchádzajúca sekcia.
V grafickom rozhraní: označte súbory, pravým tlačidlom 7-Zip → Add to archive…, vpravo dole je blok Encryption. Tam zadáte heslo a pod ním je rozbaľovacie pole Encryption method. Pri formáte zip ho prepnite na AES-256. Pri formáte 7z sa nič prepínať nedá, lebo 7z iné šifrovanie ako AES-256 nepozná.
Z príkazového riadka:
7z a -t7z -mhe=on -pHESLO archiv.7z subor1 subor2
7z a -tzip -mem=AES256 -pHESLO archiv.zip subor1 subor2
Heslo napísané priamo do príkazu ostáva v histórii shellu a je vidieť v zozname bežiacich procesov — na jednorazový archív je preto praktickejšie grafické okno.
| Vlastnosť | 7z | ZIP |
|---|---|---|
| Šifrovanie obsahu | AES-256 (iné nie je) | ZipCrypto alebo AES-128/192/256 |
| Predvoľba v 7-Zipe | AES-256 | ZipCrypto — treba prepnúť ručne |
| Skrytie názvov súborov | áno, prepínač -mhe=on | 7-Zip to pre zip neimplementuje |
| Otvorí to príjemca bez inštalácie? | zvyčajne nie | ZIP áno, AES vrstva už nie vždy |
„Encrypt file names" a prečo na tom záleží
Zašifrovaný obsah ešte neznamená zašifrovaný archív. Ak je hlavička archívu čitateľná, ktokoľvek si súbor otvorí a uvidí zoznam mien súborov, ich veľkosti a štruktúru priečinkov. Otvoriť ich nedokáže, ale často ani nemusí. Názov „vypoved_Novak_2026.pdf" alebo „audit_zisteni_final.xlsx" povie skoro všetko podstatné aj bez obsahu. Rovnako veľkosti súborov: keď má útočník podozrenie, ktorý dokument posielate, veľkosť mu ho potvrdí.
Vo formáte 7z sa táto voľba v grafickom okne 7-Zipu volá Encrypt file names a v príkazovom riadku je to -mhe=on. Nápoveda 7-Zipu k tomuto prepínaču hovorí jasne: týka sa iba formátu 7z a predvolený stav je he=off. Zapnúť sa teda musí vedome. Vedľajší efekt: takýto archív sa už nedá ani len otvoriť a prezrieť bez hesla, čo je presne to, čo chcete.
Pri ZIP-e je situácia horšia. Špecifikácia APPNOTE šifrovanie centrálneho adresára aj maskovanie mien súborov v lokálnych hlavičkách popisuje — pri nastavenom príznaku 13 sa namiesto skutočného mena uloží maskovacia hodnota — ale je to súčasť rozšírenia, ktoré bežné nástroje nepodporujú. 7-Zip túto funkciu pre zip nemá. Ak potrebujete skryť aj mená súborov, potrebujete formát 7z.
Existuje aj lacný obchvat, ktorý funguje všade: vložte súbory najprv do jedného vnútorného archívu s neutrálnym menom a ten potom zabaľte a zašifrujte. Útočník uvidí jedno meno namiesto dvadsiatich.
Prečo Windows „Compress to ZIP file" heslo neponúka
Vstavané balenie v Prieskumníkovi Windows heslo nastaviť nevie. Oficiálny postup od Microsoftu pozostáva z pravého tlačidla, Show more options → Send to → Compressed (zipped) folder a rozbalenia cez Extract All…. Žiadny krok s heslom tam nie je a stránka žiadnu takú možnosť neuvádza.
Tá istá stránka pridáva upozornenie, na ktoré sa ľahko doplatí: ak do ZIP-u pridáte zašifrované súbory, po rozbalení už zašifrované nebudú — a to môže viesť k neúmyselnému úniku citlivých údajov. Kto sa spolieha na to, že „ten súbor je predsa na disku zašifrovaný", pošle von obsah, ktorý u príjemcu skončí nezašifrovaný.
Prakticky teda: heslo na archív pod Windows znamená doinštalovať nástroj. 7-Zip je zadarmo, s otvoreným zdrojovým kódom, prevažne pod licenciou GNU LGPL a bez registrácie použiteľný aj komerčne.
Čo bude príjemca potrebovať
Toto je miesto, kde sa dobre zašifrovaný archív často zasekne. Pred odoslaním sa oplatí vedieť, na čom to bude druhá strana otvárať.
| Systém | ZIP bez hesla | 7z s AES-256 | Poznámka |
|---|---|---|---|
| Windows | vstavané | treba 7-Zip alebo podobný nástroj | Zašifrovaný archív Prieskumník neotvorí |
| macOS | vstavané | treba doinštalovať | 7-Zip pre macOS je konzolový; Keka má grafické okno |
| Android | Files by Google | treba archivačnú aplikáciu | Files by Google podporuje výhradne .zip |
| Linux | vstavané | balík 7-Zip / p7zip | 7-Zip má oficiálne linuxové zostavenia |
Dve konkrétne úskalia. Prvé: 7-Zip ponúka pre macOS iba konzolovú verziu — ak posielate 7z niekomu, kto terminál neotvára, odkážte ho radšej na grafický archivátor. Druhé, a to je dôležitejšie: Keka na svojej stránke uvádza, že AES-256 používa pre 7z súbory, kým pre ZIP používa legacy špecifikáciu Zip 2.0. Keď teda kolega na Macu pošle „zaheslovaný ZIP" z Keky, dostanete ZipCrypto so všetkým, čo k tomu patrí. Na macOS to znamená jediné: ak chcete silné šifrovanie, robte 7z.
Na Androide počítajte s tým, že vstavané riešenie stačí len na obyčajný ZIP — nápoveda k aplikácii Files by Google výslovne uvádza, že podporované sú výhradne súbory .zip. Ak viete, že druhá strana rieši všetko na mobile, spýtajte sa vopred, čo má nainštalované. Inak vám archív vráti s tým, že „sa to nedá otvoriť".
Heslo neposielajte tým istým kanálom ako odkaz
Šifrovanie chráni pred niekým, kto sa dostane k súboru, ale nie k heslu. Keď oboje pošlete tou istou cestou, útočník potrebuje kompromitovať iba jednu vec. Zopár celkom bežných situácií, v ktorých sa to stane naraz:
- Prelomená alebo prihlásená e-mailová schránka — útočník vidí prílohu aj správu s heslom v tom istom vlákne.
- Preposlanie správy ďalej. Kto prepošle e-mail s odkazom, spravidla prepošle celú históriu vrátane hesla.
- Zdieľaný firemný účet alebo skupinová konverzácia, do ktorej má prístup viac ľudí, než si myslíte.
- Nesprávny adresát pri automatickom dopĺňaní. Jedna chyba potom vydá aj archív, aj kľúč k nemu.
- Zálohy a archivácia pošty — heslo zostane uložené natrvalo vedľa dát, ktoré malo chrániť.
Pravidlo je jednoduché: odkaz a heslo musia ísť dvoma nezávislými kanálmi, ideálne takými, ktoré nekončia v tej istej schránke a nie sú prístupné z jedného účtu. Fungujúce kombinácie:
- Odkaz e-mailom, heslo nadiktované telefonicky. Najspoľahlivejšie, lebo hlas nikde nezostane.
- Odkaz e-mailom, heslo v SMS na číslo, ktoré poznáte.
- Odkaz e-mailom, heslo v šifrovanej správe (Signal a podobne), pokojne s časovaným zmazaním.
- Odkaz cez firemný chat, heslo e-mailom na súkromnú adresu — alebo naopak.
- Pri opakovanej spolupráci: heslo dohodnuté vopred osobne, pri odovzdaní sa už neposiela vôbec.
Čo nefunguje: heslo v tom istom e-maile, heslo v nasledujúcej správe toho istého vlákna, heslo v názve súboru, heslo v poznámke k zdieľanému priečinku. A tiež heslo typu „ako obvykle" — ak ho útočník raz získa, otvorí ním aj všetko staré.
Ako vyzerá heslo, ktoré má zmysel
Americký NIST vo svojej publikácii SP 800-63B (revízia 4) posunul odporúčania jednoznačne smerom k dĺžke. Pre heslá používané ako jediný faktor overenia stanovuje minimum 15 znakov (osem znakov stačí len tam, kde je heslo súčasťou viacfaktorového overenia), odporúča umožniť dĺžku aspoň 64 znakov a k pravidlám na zloženie hesla je priamočiary: overovatelia nesmú vyžadovať miešanie rôznych typov znakov. Rovnako nesmú nútiť k pravidelnej výmene hesla — zmenu si má vyžiadať až dôkaz o kompromitácii.
Tieto pravidlá sú písané pre online prihlasovanie, nie pre archívy, a je fér to povedať nahlas. Lenže pri archíve je situácia pre vás ešte horšia, nie lepšia: pri prihlasovaní na server útočníka niekto brzdí a po pár pokusoch ho zablokuje, kým súbor s archívom má útočník doma a môže skúšať heslá tak rýchlo, ako mu dovolí hardvér. O to viac tu platí, že rozhoduje dĺžka.
Prakticky: štyri až päť naozaj náhodných slov s oddeľovačmi dá tridsať znakov, ktoré si zapamätáte, a je to lepšie ako osem znakov s výkričníkom na konci. Slová musia byť náhodné, nie citát ani meno projektu. Ešte lepšie je heslo vygenerované správcom hesiel — pri jednorazovom archíve si ho aj tak nemusíte pamätať, len ho niekam bezpečne uložíte na tú chvíľu, kým ho príjemca použije. A nepoužívajte na archív heslo, ktoré máte niekde inde: archív môže roky ležať v cudzej zálohe a útočník má na jeho lámanie neobmedzený čas.
Zhrnutie do troch riadkov
Ak si z toho máte odniesť len tri veci: pri ZIP-e vždy prepnite šifrovanie na AES-256, inak dostanete ZipCrypto. Ak vám záleží aj na tom, aby nebolo vidieť názvy súborov, použite 7z so zapnutou voľbou Encrypt file names. A heslo pošlite iným kanálom než odkaz — inak je predchádzajúcich dvoch krokov škoda.
To isté platí, keď súbor posielate cez prenosovú službu, napríklad zdielajsubor.sk: odkaz na stiahnutie jedným kanálom, heslo k archívu druhým. Prenosová služba potom vidí zašifrovaný súbor, nie jeho obsah — a pri 7z so zapnutým šifrovaním názvov ani mená súborov v ňom.
Zdroje
- bkcrack — Crack legacy zip encryption with Biham and Kocher's known plaintext attack — požiadavka 12 bajtov známeho otvoreného textu (z toho 8 súvislých), obnovenie vnútorného stavu generátora a jeho použitie na ďalšie položky zašifrované rovnakým heslom, poznámka o kompresii známeho textu; odkaz na pôvodnú prácu Biham–Kocher (DOI 10.1007/3-540-60590-8_12).
- PKWARE .ZIP File Format Specification (APPNOTE 6.3.9) — traditional PKWARE encryption vs. AES (verzia formátu 2.0 vs. 5.1), šifrovanie centrálneho adresára a maskovanie mien súborov pri príznaku 13.
- 7-Zip — 7z Format — AES-256 vo formáte 7z, odvodenie kľúča funkciou na báze SHA-256 s veľkým počtom iterácií.
- 7-Zip — domovská stránka — AES-256 v 7z aj ZIP, licencia GNU LGPL, bezplatné komerčné použitie.
- 7-Zip — Download — verzia pre macOS je konzolová; zostavenia pre Windows, Linux a macOS.
- Nápoveda 7-Zipu — prepínač -m (Set compression Method) — he=on/off pre šifrovanie hlavičky (iba 7z, predvolene off) a em={ZipCrypto | AES128 | AES192 | AES256} pre zip s predvoľbou ZipCrypto.
- WinZip — AES Encryption Information — povolené dĺžky kľúča 128/192/256 bitov, CRC v Zip 2.0 ako kryptograficky nedostatočná kontrola oproti HMAC-SHA1-80 pri AES.
- Microsoft Support — Zip and unzip files — postup balenia a rozbalenia v Prieskumníkovi bez akejkoľvek voľby hesla; upozornenie, že zašifrované súbory pridané do ZIP-u budú po rozbalení nezašifrované.
- Keka — the macOS file archiver — AES-256 pre 7z, legacy špecifikácia Zip 2.0 pre ZIP.
- Files by Google — nápoveda k rozbaľovaniu archívov — podporované sú výhradne súbory .zip.
- NIST SP 800-63B (rev. 4) — Authenticators — minimum 15 znakov pre heslo ako jediný faktor overenia, 8 znakov v rámci viacfaktorového overenia, podpora dĺžky aspoň 64 znakov, zákaz pravidiel na zloženie hesla a zákaz vynúteného periodického menenia.
Prečítajte si aj: oplatí sa zipovať? · bezpečné zdieľanie súborov · kontrola súboru cez SHA-256