A kiejthető jelszavak sajnos ilyen hosszúságban nem jók.
Remélem jól értelmeztem a kódot, nem ismerem a Ruby-t :)
Használható: abcdefhkmnprstuvwx23457 // 23 karakter
Mássalhangzók: bcdfhkmnprstvwx // 15 karakter
Magánhangzók: aeu // 3 karakter
Számok: 23457 // 5 karakter
Szóval, mennyire erős az ezzel generált kiejthető jelszó?
A számokkal és a nagybetűkkel most nem foglalkozunk, majd a végén leírom hogy miért. A mássalhangzók mellett csak magánhangzók állhatnak, ezért így párok jönnek létre. Hány ilyen pár létezhet? Mássalhangzókkal kezdve: 15*3, magánhangzókkal kezdve 3*15, vagyis eddig 15*3*2 párunk van.
Mássalhangzó nem állhat egymás mellett, kivéve ha egyforma (+15), vagy ha ch, kh, ph, sh, th (+5). Magánhangzó sem állhat egymás mellett és két egyforma is csak az ee (+1) lehet. Vagyis összesen tehát 15*3*2+15+5+1 = 111 párunk van.
Ezekből a párokból épül fel a teljes jelszó, ezért egy 8 karakteres jelszó esetén 4 párunk van, vagyis összesen (15*3*2+15+5+1)^4 = 151 807 041 jelszó lehetséges eddig.
Azonban a párosok egymás mellé kerülnek és így létrejöhet olyan kombináció, ami nem megengedett, pl.: eeee, bbbb, abca, stb., tehát ezeket ki kell vonnunk. Több millió ilyen van, de az egyszerűség kedvéért most hanyagoljuk ezeket és nem vonunk ki semmit, inkább az összes jelszóval számolunk tovább.
Jöhetnek a számok. A magánhangzókat cserélgetjük számokra, de minden jelszóban csak egyet. Egy jelszóban 4 pár van, vagyis maximum 4 magánhangzónk lehet, ezeket az 5 szám egyikére cseréljük, vagyis ((15*3*2+15+5+1)^4)*4*5 eddig.
A jelszavunk mostanra már csak 7 betűt tartalmazhat. Mivel csak egy nagybetű lehet a jelszóban, ezért minden egyes jelszót még hétszer le kell generálnunk, és ezzel meg is vagyunk, összesen ((15*3*2+15+5+1)^4)*4*5*7 = 21 252 985 740 jelszó létezhet. Hát ez nem sok.
Maradjunk a LinkedIn-nél, úgyis onnan indult ki az egész. A jelszavakat SHA-1-el hashelték, salt nélkül. Az én gépem egy Core i5-ös notebook, tehát nem különösebben gyors, ráadásul php-ben írtam a feladatra programot, ami szintén nem gyors. Ezzel másodpercenként kb. 350 000 jelszónak tudom előállítani az SHA-1 hashét, vagyis kb. 16 óra alatt megvan az összes. Valójában persze ennél még rövidebb is lenne az idő, hiszen most beleszámoltam a nem megengedett jelszavakat is.
Persze 10 karakterrel is kiszámoltam, úgy 97 nap alatt lehetne előállítani a hasheket, de ebben is benne vannak a nem megengedett jelszók, szóval ez is jóval rövidebb lenne.
Ez egyáltalán nem sok :) Egy komolyabb géppel, C-ben megírva nem tudom mennyi hasht lehet előállítani, de a 10 millió nem tűnik soknak, és a 97 nap máris lecsökkent 3-ra, és ezt még mindig csak egy átlag gép számolja, nem egy cluster vagy egy szuperszámítógép.
Szóval ez így nem jó. Ahhoz, hogy tényleg nagyon biztonságos legyen az ezzel generált jelszó, nagyon hosszúnak kellene lennie, viszont akkor meg elveszik a kiejthetőség előnye.