Šifrování

LUKS (disk), GPG (soubory).

Šifrování je způsob, jak schovat data před cizíma očima — vezmeš čitelný text a pomocí klíče ho převedeš na nesmysl, který jde vrátit zpět jen s tím správným klíčem. Zní to jako jedna věc, ale lidi si pod „šifrováním" pletou spoustu různých nástrojů: LUKS na disk, GPG na soubory, TLS na síť. A hlavně — šifrování se často plete s hashováním, což je něco úplně jiného. Když si od začátku ujasníš, co je vratné a co ne a kdy který nástroj, přestane ti to celé připadat jako magie.


Pár pojmů na úvod

  • Šifrování (encryption) = vratný převod dat pomocí klíče. S klíčem data zase rozšifruješ zpátky. Účel = utajení (aby to cizí nepřečetl). Klíč pryč → data pryč, ale samo o sobě je to obousměrné.
  • Hashování (hashing) = jednosměrný otisk dat. Ze vstupu spočítáš krátký „fingerprint" a zpátky to nejde. Účel = integrita (poznat, že se data nezměnila) a ukládání hesel.
  • Klíč (key) = tajemství, kterým šifruješ a dešifruješ. Kdo má klíč, dostane se k datům — proto je ochrana klíče stejně důležitá jako samotné šifrování.
  • Symetrické šifrování = jeden klíč na šifrování i dešifrování. Rychlé, ale klíč musí znát obě strany.
  • Asymetrické šifrování = pár klíčů: veřejný (rozdáš ho) a soukromý (nikdy nikomu). Co zašifruje veřejný, rozšifruje jen soukromý (u podpisů je to opačně: podepisuje soukromý, ověřuje veřejný).
  • Passphrase = heslo (spíš celá věta), ze kterého se odvozuje šifrovací klíč. Typicky u LUKS a gpg -c.
  • „V klidu" (at rest) vs „na cestě" (in transit) = data ležící na disku vs data letící po síti. Každé chrání jiný nástroj: disk → LUKS, síť → TLS/HTTPS.

Šifrování vs hashování — to si zapamatuj první

Tohle je nejčastější zmatek, tak ho vezmeme hned a natvrdo:

ŠifrováníHashování
Vratné?Ano — s klíčem zpětNe — jen jedním směrem
K čemu?utajení datintegrita + ukládání hesel
Potřebuje klíč?AnoNe (volitelně „sůl")
PříkladLUKS, GPG, TLSSHA-256, bcrypt, argon2

Šifrování vezme text „ahoj" a udělá z něj 8f3a... — a když máš klíč, dostaneš zpátky „ahoj". Je to jako zamčená schránka: obsah tam pořád je, jen k němu potřebuješ klíč.

Hash vezme „ahoj" a spočítá 2c26b46b... — a z toho otisku už nikdy „ahoj" nesložíš. Je to jako otisk prstu: jednoznačně patří k „ahoj", ale z otisku člověka nepostavíš.

# Hash — jednosměrný otisk (ověřuje, že se soubor nezměnil)
sha256sum soubor.iso
# -> 9f86d081884c7d659a2feaa0c55ad015...  soubor.iso

# Šifrování — vratné, s heslem zpátky (viz GPG níže)
gpg -c tajne.txt        # zašifruj
gpg tajne.txt.gpg       # rozšifruj zpátky (chce heslo)

💡 Zlaté pravidlo: Hesla se hashují, ne šifrují. Kdyby šla v databázi rozšifrovat zpátky, útočník, co ukradne databázi i klíč, přečte všechna hesla. Hash zpět nejde — ani pro tebe, ani pro útočníka.


Symetrické vs asymetrické — jeden klíč, nebo pár?

Symetrické = jeden sdílený klíč. Rychlé (šifruje i gigabajty dat svižně), ale je tu háček: jak ten klíč bezpečně předáš druhé straně? Když ho pošleš po síti, může ho někdo odchytit. Proto se symetrické šifrování hodí tam, kde klíč zná jen jeden člověk — třeba tvůj disk (LUKS) nebo soubor, co si šifruješ sám pro sebe (gpg -c).

Asymetrické = pár klíčů, které patří k sobě:

  • Veřejný klíč — rozdáš ho komukoli. Slouží k šifrování zprávy pro tebe a k ověření tvého podpisu.
  • Soukromý klíč — držíš ho v tajnosti a chráníš heslem. Jím rozšifruješ, co ti někdo poslal, a jím podepisuješ.

Kouzlo je, že klíče jsou spárované asymetricky: co zamkne veřejný, otevře jen soukromý.

Díky tomu si dva lidi, co se nikdy nepotkali, můžou bezpečně psát — bez toho, aby si předem předávali tajný klíč. Praxe většinou kombinuje obojí: asymetrikou se bezpečně domluví jednorázový symetrický klíč (rychlý), a jím se pak šifruje samotný provoz. Přesně tak funguje HTTPS.


LUKS — šifrování celého disku

LUKS (Linux Unified Key Setup) je standard pro šifrování celých oddílů nebo disků v Linuxu. Nešifruje jednotlivé soubory — šifruje celý blok pod souborovým systémem. Chrání data „v klidu": když ti někdo ukradne vypnutý notebook, vidí jen šifrovaný nesmysl. Bez passphrase se k datům nedostane, i kdyby disk vyndal a připojil jinam.

⚠️ Pozor: LUKS chrání jen vypnutý (nebo hibernovaný) stroj. Uspání do RAM (suspend) data nechrání — master klíč zůstává v paměti, takže probuzený notebook je odemčený a klíč jde z RAM vytáhnout (cold-boot / DMA útok). Citlivý stroj bez dozoru raději vypni nebo hibernuj, neuspávej.

Jak to funguje v kostce: při bootu tě systém požádá o passphrase, tou odemkne šifrovací klíč a disk se „otevře" jako běžný oddíl. Za běhu o šifrování ani nevíš — čte a zapisuje se transparentně.

# POZOR: luksFormat NEVRATNĚ přepíše oddíl. Ověř si název (lsblk)!
sudo cryptsetup luksFormat /dev/sdX1        # vytvoř šifrovaný oddíl (zeptá se na passphrase)
sudo cryptsetup luksOpen /dev/sdX1 tajnydisk # odemkni -> vznikne /dev/mapper/tajnydisk
sudo mkfs.ext4 /dev/mapper/tajnydisk         # založ na odemčeném zařízení filesystem
sudo mount /dev/mapper/tajnydisk /mnt        # připoj a používej normálně
# ...po práci:
sudo umount /mnt
sudo cryptsetup luksClose tajnydisk          # zase zamkni

💡 Když má systém šifrovaný / (full-disk encryption přes LUKS, běžná volba už při instalaci), chce heslo hned při startu — dřív, než naběhne plocha. To je odemykání disku, ne přihlášení do účtu; jsou to dvě různé věci (a klidně dvě různá hesla).

Kdy LUKS: chceš chránit všechno na disku/notebooku najednou a nechceš řešit „zašifroval jsem tenhle soubor, a tamten?". Zapne se u instalace jedním kliknutím a dál se o nic nestaráš.


GPG — šifrování a podpis souborů

GPG (GNU Privacy Guard) je švýcarský nožík na šifrování jednotlivých souborů a mailů a na digitální podpisy. Umí obě varianty šifrování:

Symetricky (gpg -c) — zašifruješ heslem, žádné klíče neřešíš. Ideální, když si chceš jen odložit soubor tak, aby ho nikdo bez hesla nepřečetl:

gpg -c dokument.pdf        # -> dokument.pdf.gpg (chce heslo)
gpg dokument.pdf.gpg       # rozšifruj zpátky (chce stejné heslo)

Asymetricky — vyrobíš si klíčový pár a používáš veřejné/soukromé klíče:

gpg --full-generate-key                  # vytvoř svůj pár (veřejný + soukromý)
gpg --export -a "tvuj@mail" > public.asc # veřejný klíč, co můžeš rozdat
# někdo ti zašifruje soubor TVÝM veřejným klíčem, ty ho otevřeš svým soukromým
gpg -e -r "tvuj@mail" tajne.txt          # zašifruj pro příjemce
gpg -d tajne.txt.gpg                      # dešifruj svým soukromým klíčem

Podpisy = druhé velké využití GPG. Podpisem soukromým klíčem dokážeš, že něco pochází od tebe a nebylo to změněno; kdokoli to ověří tvým veřejným klíčem. Přesně tak se ověřuje pravost balíčků (dnf/apt kontrolují podpisy repozitářů) nebo Git commitů:

gpg --verify balicek.tar.gz.sig balicek.tar.gz   # sedí podpis? -> od koho a nezměněno
git commit -S -m "feat: ..."                      # podepsaný commit

💡 Rozdíl podpis vs šifrování: šifrování řeší „nikdo cizí to nepřečte" (utajení). Podpis řeší „je to fakt od tebe a nezměněné" (pravost + integrita). GPG umí obojí, klidně naráz.

Kdy GPG: jeden konkrétní soubor nebo mail, který chceš poslat/uložit šifrovaně, nebo když chceš něco podepsat. Na celý disk se nehodí — od toho je LUKS.


TLS/HTTPS — šifrování „na cestě" (jen zmínka)

Zatímco LUKS chrání data ležící na disku, TLS chrání data letící po síti. To je to „S" v HTTPS a ten zámeček v prohlížeči. Když se připojíš k webu, tvůj prohlížeč a server se přes asymetrické klíče domluví na jednorázovém symetrickém klíči a jím pak šifrují celou komunikaci — takže nikdo na cestě (Wi-Fi, poskytovatel, útočník) neuvidí, co si posíláte, ani to nezmění.

Princip je stejná stavebnice, jakou už znáš (symetrika + asymetrika + podpisy/certifikáty), jen aplikovaná na síť. Detaily certifikátů a HTTPS necháme na kapitolu o síti — tady stačí zapamatovat: LUKS = data v klidu, TLS = data na cestě.


Kdy co použít (rychlá tabulka)

Chci chránit...NástrojProč
Celý notebook / disk / oddílLUKSjeden zámek na všechno, chrání ukradený stroj
Jeden soubor nebo mailGPGcílené šifrování/podpis konkrétní věci
Data letící po sítiTLS/HTTPSšifruje spojení, ne uložená data
Ověřit, že se soubor nezměnilhash (sha256sum)otisk, ne šifra — integrita
Uložit uživatelská heslahash (bcrypt/argon2)jednosměrné, nesmí jít rozšifrovat

Failure modes — časté omyly

  • Záměna hashování a šifrování. „Zašifruju to SHA-256" — ne, SHA-256 je hash, nejde vrátit zpět. A obráceně „zahashuju to, ať se to dá později přečíst" — hash přečíst zpátky nejde. Nejdřív si ujasni, jestli chceš data vrátit (šifra), nebo jen ověřit/uložit heslo (hash).
  • Ztráta LUKS passphrase = ztráta dat. Natvrdo. Neexistuje žádný „zapomněl jsem heslo" ani backdoor ani hotline — to je celý smysl šifrování. Passphrase si zálohuj (správce hesel, papír v šuplíku) a zvaž si přidat druhý klíčový slot (cryptsetup luksAddKey) jako pojistku.
  • Šifrovaný disk, ale slabá passphrase. LUKS s heslem 1234 je zámek s klíčem pod rohožkou. Síla celé ochrany = síla passphrase. Dlouhá (16+ znaků), ne slovníková.
  • Soukromý GPG klíč bez zálohy a bez hesla. Bez zálohy o klíč přijdeš při přeinstalaci (a nic starého už nerozšifruješ). Bez hesla ho kdokoli u tvého počítače rovnou zneužije. Zálohuj soukromý klíč bezpečně a chraň ho heslem — veřejný klidně rozdávej, ten je na to.
  • „Zašifruju hesla v databázi." Klasika, a špatně. Hesla se hashují (bcrypt/argon2 + sůl), ne šifrují. Šifrování by šlo rozšifrovat — kdo ukradne DB i klíč, má všechna hesla. Hash zpět nejde.

🛠️ Cvičení

  1. Šifra vs hash prakticky. Spočítej sha256sum nějakého souboru dvakrát za sebou a porovnej výstup. Pak soubor o jeden znak změň a spočítej znovu. Co se stalo a proč se tomu říká „otisk"? Šel by z toho otisku soubor složit zpátky?
  2. Symetrické GPG. Zašifruj textový soubor přes gpg -c, smaž originál, a rozšifruj ho zpátky. Jaké tajemství tu hraje roli klíče? Kolik lidí ho musí znát?
  3. Rozmysli nástroj. Ke každé situaci přiřaď LUKS / GPG / TLS / hash a zdůvodni: (a) ukradli mi vypnutý notebook, (b) posílám kolegovi jeden citlivý PDF, (c) ukládám hesla uživatelů webu, (d) přihlašuju se do internetového bankovnictví.
  4. Podpis vs šifrování. Vysvětli vlastními slovy rozdíl mezi tím, když soubor GPG zašifruješ, a když ho GPG podepíšeš. Který z nich řeší „nikdo cizí to nepřečte" a který „je to fakt od tebe"?
  5. (Pro odvážné, na testovacím disku/USB!) Na prázdném USB nebo virtuálním disku vyzkoušej cryptsetup luksFormat, luksOpen, založ filesystem, připoj, zapiš soubor, odpoj a luksClose. Pak zkus data přečíst bez odemčení. Co uvidíš?
Náčrt řešení — rozbal, až si cvičení zkusíš sám
  1. Šifra vs hash — dvakrát po sobě dá sha256sum stejný otisk (hash je deterministický). Po změně jednoho znaku se otisk kompletně změní — proto pozná i drobnou úpravu (integrita). Zpátky soubor složit nejde: hash je jednosměrný, z krátkého otisku původní data nepostavíš. Pozor: proto se hash hodí na ověřování a hesla, ne na „schování, co se dá vrátit".
  2. Symetrické GPGgpg -c soubor vytvoří soubor.gpg a chce heslo (passphrase); to je tady tajemství v roli klíče. Rozšifruješ gpg soubor.gpg stejným heslem. Znát ho musí jen ten jeden člověk (ty) — proto je symetrika ideální na „šifruju sám pro sebe". Pozor: kdo zná heslo, čte data; a když heslo zapomeneš, soubor je pryč.
  3. Který nástroj — (a) ukradený vypnutý notebook → LUKS (data v klidu na celém disku); (b) jeden citlivý PDF kolegovi → GPG (cílené šifrování/podpis souboru); (c) hesla uživatelů → hash (bcrypt/argon2 + sůl, nikdy ne šifrování!); (d) bankovnictví → TLS/HTTPS (šifrování spojení „na cestě"). Pozor: každá vrstva řeší jiné místo — disk, soubor, síť, uložené heslo.
  4. Podpis vs šifrováníšifrování převede obsah na nečitelný a otevře ho jen ten, kdo má klíč → řeší „nikdo cizí to nepřečte" (utajení). Podpis obsah nezakryje, ale přiloží k němu důkaz tvým soukromým klíčem → kdokoli tvým veřejným klíčem ověří, že je to od tebe a nezměněné → řeší „je to fakt od tebe" (pravost + integrita). Pozor: jde to i naráz — podepsat a zašifrovat zároveň.
  5. LUKS na USB — po luksFormat + luksOpen vznikne /dev/mapper/<jmeno>, na tom založíš filesystem, připojíš a zapisuješ normálně. Po luksClose a pokusu číst syrová data oddílu (hexdump/dd) uvidíš jen šifrovaný nesmysl, žádný čitelný soubor — přesně to vidí zloděj s ukradeným diskem. (Pozn.: cryptsetup luksDump naopak ukáže čitelnou hlavičku — cipher, sloty, UUID — takže sám o sobě není důkaz zašifrování dat.) Pozor: luksFormat maže data, dělej to jen na prázdném/testovacím médiu.

🧠 Otázky & odpovědi

Jaký je rozdíl mezi šifrováním a hashováním?

Šifrování je vratné: pomocí klíče převedeš data na nesmysl a stejným (nebo párovým) klíčem je dostaneš zpátky — účelem je utajení. Hashování je jednosměrné: spočítá z dat krátký otisk a zpátky se z něj původní data složit nedají — účelem je integrita (poznat změnu) a bezpečné ukládání hesel. Pravidlo: chceš data někdy vrátit → šifruj; chceš jen ověřit nebo uložit heslo → hashuj.

Proč se hesla v databázi mají hashovat a ne šifrovat?

Protože šifrování jde rozšifrovat zpátky. Kdyby útočník ukradl databázi i šifrovací klíč, přečetl by rovnou všechna hesla v čitelné podobě. Hash zpátky nejde — ani pro útočníka, ani pro tebe. Při přihlášení zahashuješ zadané heslo a jen porovnáš otisky, samotné heslo nikde neukládáš. Používej na to bcrypt nebo argon2 se solí, ne holé SHA. Aplikace nikdy nepotřebuje heslo přečíst zpět — jen ověřit, že sedí.

Co se stane, když zapomenu passphrase k LUKS disku?

Přijdeš o data. Natvrdo a nezvratně — v tom je celý smysl šifrování. Neexistuje backdoor, master heslo ani hotline, která ti to odemkne; kdyby existovaly, nebyl by disk vlastně chráněný. Proto si passphrase zálohuj (správce hesel, papír na bezpečném místě) a zvaž přidat druhý klíčový slot přes cryptsetup luksAddKey jako pojistku pro případ, že na to hlavní zapomeneš.

Kdy použít LUKS a kdy GPG?

LUKS na celý disk nebo oddíl — chceš chránit všechno na notebooku najednou pro případ krádeže, zapneš to typicky u instalace a dál nic neřešíš (data v klidu). GPG na jednotlivé soubory nebo maily — když chceš zašifrovat jeden konkrétní dokument, poslat ho někomu, nebo něco podepsat. Zjednodušeně: celý disk = LUKS, jeden soubor = GPG. TLS je pak třetí věc — šifruje data na cestě po síti, ne uložená na disku.

K čemu je u GPG veřejný a soukromý klíč?

Tvoří pár, který patří k sobě. Veřejný klíč klidně rozdáš — ostatní jím zašifrují zprávu pro tebe a ověří tvůj podpis. Soukromý klíč držíš v tajnosti a chráníš heslem — jím rozšifruješ, co ti poslali, a jím podepisuješ. Kouzlo je, že co zamkne veřejný klíč, otevře jen soukromý; u podpisů je to opačně — podepisuje se soukromým a ověřuje veřejným. Díky tomu si můžou bezpečně psát i lidi, co si nikdy nepředali žádné společné heslo. Soukromý klíč si proto zálohuj a chraň heslem — jeho ztráta nebo únik shodí celou ochranu.