Feltörhetetlen jelszavak

A Nyest cikkét olvasva megint elgondolkodtam ezen a jelszóproblémán, már nem először. S megint arra jutottam, hogy feltörhetetlen jelszó természetesen nincs, de létre lehet hozni olyanokat, amiknek a feltörése elképzelhetetlenül sokáig tartana.
  A Kissy tizenötödik részében is lesz említés a következő technikáról:
  

ՏАJΤ

  Ugye milyen egyszerű, köznapi jelszó? Minden szótárban benne van. Hát ezt a jelszót átlagos hacker soha nem tudja feltörni, a szuperdörzsöltnek pedig időtlen időkig eltarthat. Ha az olvasó átmásolja a jelszót egy olyan szövegszerkesztőbe, ami közli a karakterkódokat (például BabelPadba), ki fog derülni, hogy itt csak egy latin betű szerepel, a J. Az S nem S, hanem egy örmény tjun betű, igazából t-nek kellene olvasni. Az A cirill betű, a T pedig egy görög tau.
  Az most mellékes, hogyan tudja a jelszó jogos tulajdonosa begépelni az ilyen jelszót. Akár egy karaktertáblával is lehet (az örményhez én is azt használtam, bár persze van örmény billezetem, de így most egyszerűbb volt; a többi meg rajta van a csodabillentyűzetemen), a lényeg az, hogy legyen a gépen olyan program, amin a szükséges karakterek elérhetők és a jelszó jogos tulajdonosa ismeri a használatát.
  A fő kérdés az, hogy ez a jelszó mennyire biztonságos. Átlagos hacker maximum a hétbites ASCII-vel kalkulál, szóköztől a ~ karakterig, de már ez is iszonyú mennyiség egy brute-force algoritmusnak. Ha tudja, hogy a felhasználó magyar, akkor hozzáveszi a magyar ábécé betűit; ha a felhasználó orosz, akkor az oroszét, és így tovább. Ha több különböző írásrendszerből válogatunk össze karaktereket, akkor mindet szerepeltetni kell a brute-force programnak megadott jelkészletben, és elképesztő számok jönnek ki:
  – angol ábécé: 52 karakter;
  – hétbites ASCII: 95;
  – ASCII + magyar ábécé: 113;
  – cirill alapábécé: 64;
  – görög alapábécé: 49;
  – örmény ábécé: 76;
  – angol, cirill, görög és örmény: 241;
  – hétbites ASCII, cirill, görög és örmény: 284.
  Ez az utolsó kombináció kell ahhoz, hogy egy ilyen jelszót meg lehessen fejteni:
  
Տտ&Мοοn

  Két örmény betű, egy ASCII karakter, cirill M, két görög omikron és egy latin betű. Ugyanakkor két egyszerű angol szót utánoz, amik összefüggenek, csak ezekkel a kódokkal semmilyen szótárból nem fognak előkerülni.
  Csak négy írásrendszert használtunk, de máris közel háromszáz karakterre növeltük a terhet, amivel a brute-force algoritmusnak meg kell küzdenie. Valójában azonban még többre. Semmiféle hacker nem tudja kigondolatolvasni, hogy mely írásrendszerek karaktereit szerepeltettük a jelszavunkban: ha egynél több fordul elő, akkor kénytelen lesz végigpróbálni az összeset. Akár az egész Unicode-ot.

Mekkora számítási kapacitás kell egy ilyen jelszó feltöréséhez? Számoljunk. Ha tudjuk, hogy a jelszó k darab karakterből áll, amiket egy a darabos jelkészletből válogattunk, akkor ak darab ilyen jelszó lehetséges. (Valójában nem szoktuk tudni, hogy milyen hosszú a jelszó, tehát a nyolcbetűs jelszavakhoz is csak úgy jutunk el, hogy előbb az egybetűsöktől a hétbetűsökig mindent végigpróbálunk. De a könnyebb számítás kedvéért most feltesszük, hogy ismerjük a jelszó pontos hosszát.)
  Például egy 26 betűs jelkészletből (abcdefghijklmnopqrstuvwxyz) összeállítható két karakter hosszúságú szavak száma 262, azaz 676, konkrétan aa-tól zz-ig. Ez nem sok. Azért ajánlanak mindig jó hosszú jelszavakat, hogy növeljék a hatványkitevőt, hiszen ötbetűs jelszóból már közel 12 milliót lehet készíteni csak ezzel a 26 betűvel. Ha a teljes hétbites ASCII-ből készítünk ötbetűs jelszavakat, az 955 = 7,7 milliárd jelszó lesz, vagyis ha másodpercenként egymillió kombinációt próbál ki a program (az én öreg gépem közel ennyit tud, úgyhogy nem is mondtam sokat), akkor alig két óra alatt megvan.
  Logikus a gondolat, hogy egyszerűbb és célszerűbb a jelszó hosszát növelni, hiszen ha kétszer akkora jelszót veszünk: 9510 = kétmillió évnyi jelszótörés az iménti sebességgel, ellenben ha ugyanolyan hosszút háromszor akkora jelkészletből: 2845 = mindössze 21 év. Sokkal jobban megéri hosszú jelszót adni, mint a jelkészletet bővíteni.

De csak matematikailag. Pszichológiailag a 284 darabos jelkészlet az életben semmilyen hackernek nem fog eszébe jutni. Ül a gépe előtt kétmillió évig, a teljes hétbites ASCII-ből végigpróbálta a kombinációkat az egy darab szóköztől a tíz darab ~ jelig, és a gép visítva rohan neki a tizenegy betűs kombinációknak, amik újabb száznyolcvanmillió évet fognak fölemészteni – és egész idő alatt nem volt semmi esélye, mert a jelszó olyan karaktereket is tartalmaz, amiket ő egyáltalán nem tett bele a program által vizsgálandó jelkészletbe. Történetesen azok a jelszótörő programok, amiket jómagam ismerek, nem is tudnak tetszőleges jelkészletre keresni; némelyikben meg lehet adni ugyan saját ábécét, de a magyar hosszú ő-ű átváltozik ékezet nélküli o-u-vá. Ezeknél elég egyetlen cirill vagy görög betű, és soha nem lesznek képesek feltörni a jelszót.
  Némelyik karaktertábla-program képes a teljes Unicode-ot mutatni, vagyis a felsőbb táblákat is; például a fent említett BabelPad karaktertáblája, ami külön programként is elérhető. Ezekkel megcsinálhatjuk azt a trükköt, hogy abszolúte ismeretlen karaktereket rakunk a jelszóba. Például a linkelt oldalon levő kép tanúsága szerint az U+1F354-es karakter egy hamburgert ábrázol. Ha fölrakunk egy ilyen karaktertábla-programot, egy megfelelő fontot, és olyan jelszót választunk, hogy
  

ettem egy *t

  ahol a csillag helyén ez a hamburgerábra van… ez egy csupán tizenkét karakteres jelszó, de csak akkor lehet rábukkanni, ha a teljes Unicode-ot végigkeresi az ember. A 6.1-es kiadásban kis híján száztízezer karakter van, de ha már liba, gágogjon, a hacker nem tudhatja, hogy nem egy teljesen definiálatlan karaktert választottunk-e. Módunkban áll. Például U+03A2 egy nemlétező karakter kódja, a görög nagy ró és szigma között; itt lyuk van az ábécében, mert ez lenne a szóvégi szigma nagybetűs párja, ilyen pedig nincsen. Ezt is meg lehet jegyezni: lehet a jelszó ΣΠqΡ, vagyis a latin SPQR rövidítés (a szenátus és a római nép) görög betűkkel leírva, és azt játsszuk, mintha a görögben is lenne Q betű, éspedig U+03A2. A karaktertábla azt is kiadja, egy kis kockát látunk helyette.
  Így viszont a jelkészlet már a teljes és abszolúte teljes Unicode-kódtartományt át fogja fogni, U+0000-tól U+10FFFF-ig, leszámítva néhány olyan karaktert, amiket nem tudunk a jelszót igénylő program szövegdobozába még bemásolni se. Ez viszont már 1,1 millió darabot jelent. Tíz betű ebből a készletből 1028 milliárd évbe telik, pedig közben már egymilliárdszorosára növeltem a számítógép sebességét.

»»»»»»