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á