PHP Šifrování a crackování hesel

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: Harvie
Datum: 10.3.2007
Hodnocení/Hlasovalo: 2.54/13

Šifrování hesel. Crackování zašifrovaných hesel, hashů a podobných pomocí PHP.

V minulém článku jsem na zjednodušeném případě ukazoval jak s tak mocným nástrojem jako je PHP můžeme zkoušet hesla k mailům, FTP účtům a k mnoha dalším systémům.

Dnes si ukážeme jak obdobný postup použít na zašifrovaná hesla, MD5ky a podobné. Když říkám zašifrovaná hesla, ve skutečnosti myslím cryptografické hashe hesel.

Key derivation function
Taková funkce funguje tak, že jí zadáme následující parametry: heslo, salt [a počet iterací]

heslo = heslo, které šifrujeme
salt = řetězec (typicky 2 znaky), kterým se heslo "zašifruje"
počet iterací = kolikrát se ještě zašifruje výsledný šifrát (šifra šifry z šifry = 3 iterace)

Funkce nám vrátí řetězec v následujícím formátu: SaltZašifrované_heslo
není to šifra v pravém slovasmyslu, protože je nemožné zpětně heslo dešifrovat (jde o něco mezi hashem a šifrou, tj. zaširovaný hash).

To se používá například v Unixech (systémová hesla jsou uložena v souboru /etc/passwd, ke kterému má přístup pouze root) nebo ve webových aplikacích.
více o /etc/passwd

Řádek v takovém souboru vypadá například takto:
root:fi3sED95ibqR6:0:1:SystemOperator:/:/bin/ksh Nás zajímá pouze toto:
root:fi3sED95ibqR6

rozbor:
root - uživatelské jméno
: - oddělovač
fi3sED95ibqR6 - zašifrované heslo
fi - první dva znaky hesla = salt
3sED95ibqR6 - zbytek hesla

Když se uživatel snaží zalogovat do Unixového systému, program běžící pod rootem (login shell - jeho prostřednictvím se uživatel přihlašuje) načte (z klávesnice, ssh,...) uživatelské jméno (např. root), najde si jeho záznam v /etc/passwd a přečte první dva znaky z hashe hesla (tj. tzv. salt). Tímto saltem pomocí stejného algoritmu jako při zakládání účtu zašifruje heslo zadané přihlašujícím se uživatelem. Potom výsledný hash porovná s hashem v /etc/passwd (nyní jsou běžnější stínovaná hesla v /etc/shadow, to poznáte tak, že v /etc/passwd je místo hashe pouze "x", "*" nebo "!".), pokud se shodují, uživateli je udělen přístup. Ještě musím dodat, že při vytváření nového účtu je na Unixu tento salt generován náhodně (tím se zabrání tomu, aby v případě, že mají dva nebo více uživatelů stejné heslo se to dozvěděli tak, že mají stejný záznam v /etc/passwd).

My si tento proces můžeme naprogramovat sami, ale tak aby se prováděl bez prodlevy a nezablokoval účet po několika neplatných pokusech (pokud se nám podaří k podobným hashům dostat), využijeme k tomu PHP a jeho funkci crypt(string heslo, string salt):



Použití:
Skript načítá ze standartního vstupu řádku po řádce heslo, hashuje ho a pokud nalezne platné heslo, vypíše ho. Jinak je návod na použití stejný jako u minulého článku.

Domácí úkol:
- Upravit skript na kolidování MD5
- to samé ale pro 3x iterovanou MD5
- Upravit skript tak aby se zastavil při nalezení prvního platného hesla.

Tip nakonec:
- Lidská hloupost je neomezená