Na ABCLinuxu se nám rozvinula podivná diskuse nad délkou hesla a jeho lámáním. Ukazuje se, že i někteří ostřílení mazáci v tom mají hokej. Pojďme si tedy jednoduše ukázat, jak se to má s počtem znaků hesla, velikostí abecedy a kryptografickou silou (entropií).
Heslo sestavujeme ze znaků. Znaky můžeme vybírat z nějaké abecedy. Pro jednoduchost (a vzápětí uvidíme, že si s tím bohatě vystačíme), budeme uvažovat malá písmena anglické abecedy. Tedy, pokud správně počítám, 26 znaků.
Každý znak hesla vybíráme z množiny 26 znaků. Jednopísmenné heslo představuje tedy jeden možný stav z 26. Jak je to u víceznakových hesel? Každé další písmeno vybíráme ze stejné abecedy, takže počet možných stavů tříznakového hesla je 26*26*26. V tomto případě tedy 26^3. Začíná v tom být vidět jistý vzor.
Obecně platí, že počet všech stavů pro abecedu o velikosti V a délce hesla N platí:
počet možných hesel = V^N
Zatím jistě žádné překvapení. Pokud si vyzkoušíme tento vzorec pro nějaké reálné situace, kupříkladu malá velká abeceda + číslice a heslo má 15 znaků, dojdeme k obrovským číslům:
62^15 = 768909704948766668552634368
Je to málo? Je to moc? Z hlediska běžné lidské zkušenosti je to nepředstavitelně obrovské číslo. Pro lepší uchopení velkých čísel si lidi vymysleli logaritmy (;-)). Kde co je vyjádřeno v logaritmické škále (dB u zvuku, magnituda u zemětřesení), protože bychom jinak pracovali s extrémně malými nebo velkými čísly. Nejinak je tomu v informatice.
Ve fyzice se entropie používá pro vyjádření míry neuspořádanosti. Nebudeme zde zacházet do teorie termodynamiky, mikro a makro stavy, od toho jsou popularizační přednášky.
Entropie zkrátka vyjadřuje míru neznalosti daného stavu. U zcela náhodného systému vůbec nedokážeme odhadnou konkrétní stav a tedy každý z nich je pro nás stejným překvapením. Tedy, entropii můžeme vyjádřit jako množství všech stavů, ze kterých můžeme vybrat jeden konkrétní stav.
Abychom se tedy dostali ke konkrétním číslům, v informatice vyjadřujeme entropii jako počet bitů nějaké informace. Je to nejpřirozenější. Kolik bitů informace tedy nese naše heslo o tři odstavce výše? Pomůžeme si logaritmickým počtem ze střední školy:
log(V^N)/log(2), pro konkrétní zadání potom log(62^15)/log(2) = 89b.
Vlastně jsme jen převedli číslo na jiný základ, 62^15 je cca 2^89. Je to málo, nebo moc? :-D
Tady se dostáváme k pojmu kryptografická síla. Ta se udává v bitech. Dneska se za minimum považuje 128b a i pod tímto číslem se chvěje židle. NIST doporučuje až 256b.
NSA si život nekomplikuje a přináší jeden řádek:
Převedeno do reality, já používám:
- AES-256
- RSA-4096
- ECC klíče nepoužívám
- SHA-512/512
- Hesla (sdílená tajemství) 128
Toto je vlastně volné pokračování článku z roku 2013.
Tedy 89b je opravdu hodně málo. Ekvivalent RSA-1024 se v EU nesmí používat (pro oficiální věci, doma si dělejte co chcete) od roku 2010. Abychom za použití této abecedy dosáhli alespoň na 128b, potřebujeme délku hesla 22 znaků.
A co různé speciální znaky? Mnoho lidí rádo přidává do hesla „speciální“ znaky z přesvědčení, že nějak magicky heslo posílí. Není tomu tak. Pouze tím zvětší velikost abecedy, nic víc. Stejného výsledku lze dosáhnout prodloužením hesla. Ze znalosti exponenciální funkce plyne, že exponent má rozhodující roli, tedy pár znaků navíc udělá víc, než velikost základu.
Osobně jako admin ze zkušeností používám co nejjednodušší abecedu. Malá písmena stačí. Proč? Protože psát komplikované znaky do různých terminálů přes různé vzdálené plochy se vám nemusí vůbec podařit. Vskutku, různé widle (i na serverech) jsou natvrdo přepnuté do češtiny, takže dostat se na login serveru ve vmware před vzdálenou plochu na českých windows je makačka a znaky jako $ tam prostě někdy nemáte šanci napsat. Takže používám základních 26 znaků anglické abecedy. Asi si myslíte, že heslo bude šíleně dlouhé, vždyť i pro abecedu se 62 znaky nám vyšlo na 22 znaků? Nikoliv:
log(26^28)/log(2) = 131
I s podstatně menší abecedou (26 vs 62) nám stačilo délku hesla zvýšit pouze o 6 znaků a dosáhli jsme stejného cíle.
Není tedy vůbec potřeba do hesla přidávat magické znaky. Ničemu nepomohou a lecos můžou zkomplikovat. Důležitá je pouze celková entropie hesla. Klidně mějte heslo jen z jedniček a nul, pokud bude náhodné a minimálně 128 znaků dlouhé.
Toto ovšem naráží na konkrétní realizaci některých přihlašovacích systémů. Některé weby, nevím proč, vyžadují heslo s minimální ale i maximální délkou. Ano, omezují maximum. Tj moje hesla generovaná z klíčenky někdy nelze použít pro jejich délku. Můžeme se jen domnívat, co se s tímto řetězcem potom děje dál. Z minulosti jsou známé příklady, že se bralo pouze prvních x znaků hesla a zbytek se ignoroval. Tedy, mít dobré heslo je podmínka nutná, ale nikoliv postačující pro celkovou bezpečnost.
Ve zmíněné diskusi padly další možnosti, jak lámání hesla zkomplikovat. Ano, existují lepší či horší KDF, které mají prodloužit výpočet klíče z hesla, ale které mají vlastní problémy (třeba postranní kanál, ze kterého lze odhadnout délku hesla). Ano, lze nastavit miliony iterací, aby každé ověření hesla trvalo 10s. Ale se složitostí hesla to neudělá vůbec nic. Ta je dána jen počtem znaků a zvolené abecedě. Ve výsledku těch operací bude stále stejně. Jen některé budou pomalejší.
A na závěr si dovolím takové malé zamyšlení. Je nutné neustále zvyšovat délku hesla, nebo obecně nějakého tajemství? Budeme to muset dělat do nekonečna? Ve skutečnosti nikoliv. Žijeme ve světě, kde je nějaká fyzikální realita. V pozorovatelném vesmíru, podle dobrých odhadů, je cca 10^80 částic. To je jen 265b. Pokud bychom vzali elementární náboj jako jednotku minimální energie (což má také své problémy), opět se dostaneme na docela normální čísla. Tady je odvození rychlosti „celoplanetárního počítače“ postaveného na (dnes známých) fyzikálních limitech (které jsou ovšem naprosto mimo možnosti realizace) a 512b v pohodě drží. Za domácí úkol si to spočtěte pro odhadovanou hmotu pozorovatelného vesmíru. Ono těch bitů fakt není potřeba nijak moc. Na závěr provokativní přednáška: