Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: PHP: Třída pro autorizaci a autentifikaci

Aktivity
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:18.12.2012 11:32

Ahoj, určitě jste si všimli, že jsem byl nějakou dobu zde na devbooku méně aktivní, než obvykle. Dnes jsem dopsal jednoduchý MVC (možná spíše MVP) framework pro PHP, který zde chci rozepsat do tutoriálů a na kterém jsem nyní nějakou dobu pracoval.

Projekt stačí již jen počeštit a mohu začít sepisovat první díly. Chtěl jsem sem ještě hodit kód třídy, která provádí autorizaci a autentifikaci, zda tam nejsou nějaké bezpečnostní trhliny nebo zda nejde něco udělat jednoduššeji. Je tam řešeno i automatické přihlašování přes Cookie. Samozřejmě mě hlavně zajímá, co na to říká Kit :)

Zdroják třídy: http://www.itnetwork.cz/dev-lighter/49

Odpovědět
18.12.2012 11:32
New kid back on the block with a R.I.P
Avatar
Luboš Běhounek Satik:18.12.2012 12:00

Pokud by jsi chtel byt hodne paranoidni, tak pro zvyseni bezpecnosti hesel muzes jeste pridat salt hesla ke kazdymu uzivatelovi zvlast.

Kdyz ti nekdo ukradne db a tenhle jeden salt, co mas ted, tak pak vsechny hesla vlastne muze louskat najednou, ale kdyz ma jeste navic kazdej uzivatel svuj salt (treba nahodne vygenerovanej), tak musi uplne kazdyho uzivatele louskat zvlast.

takze fce passwordhash by pak vypadala treba takhle:

// Vrátí otisk (hash) hesla
private function passwordHash($password, $userSalt)
{
    return hash('sha512', $password . self::SALT . $userSalt);
}
Nahoru Odpovědět
18.12.2012 12:00
https://www.facebook.com/peasantsandcastles/
Avatar
sdraco
Neregistrovaný
Avatar
Odpovídá na Luboš Běhounek Satik
sdraco:18.12.2012 13:11

Jo, ja vim, na devbooku to je takto udelane a hash se jeste pocita iterativne, jsem hodne paranoidni :-) Tutorial jsem tim vsak nechtel zatezovat.

 
Nahoru Odpovědět
18.12.2012 13:11
Avatar
Kit
Tvůrce
Avatar
Odpovídá na
Kit:18.12.2012 13:38

Iterativní hash? To si nedovedu moc představit. Algoritmus pro výpočet hashe je iterativní a vylepšit se to nedá.

Náhodně vygenerovaný salt pro každého uživatele také musí být někde uložen. Bezpečnost to tedy nezvyšuje.

Bezpečnost musí být soustředěna pouze do klíče, tedy heslo+salt.

Nahoru Odpovědět
18.12.2012 13:38
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
sdraco
Neregistrovaný
Avatar
Odpovídá na Kit
sdraco:18.12.2012 13:51

Pridelavam tak narok na vypocetni vykon k prolomeni hashe hrubou silou. Iter. hash je hash pocitany danym algoritmem nekolikrat (jako vstup je pouzity hash z minule iterace). Ac konstantne, tak velmi zvysim cas k vypoctu, ja to delam jednou, on si tak nevygeneruje rainbow tabulku, protoze by nad tim ztravil veku. To same plati pro dynamickou sul, ta rainbow tabulky eliminuje uplne.

 
Nahoru Odpovědět
18.12.2012 13:51
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:18.12.2012 13:57

Pár postřehů k programu:

  • proč počítáš hash mimo databázi?
  • proč se před změnou hesla ptáš v DB na staré, když se to dělá jedním vrzem?
  • proč se při loginu ptáš v DB na heslo? Potřebuješ jen id

Zvykni si na to, že u kvalitně udělaných databází není možné z tabulky vytáhnout heslo ani jeho hash a přizpůsob program tomuto požadavku.

Nahoru Odpovědět
18.12.2012 13:57
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:18.12.2012 14:24

Ale náhodně vygenerovaný salt pro každého uživatele celkovou bezpečnost všech hesel opravdu zvyšuje.
To, že útočník získá i salt uživatele na tom nic nemění, pořád musí lámat heslo každýho uživatele zvlášť.

Hádání hesla, když je salt jen globální:
Máš globální salt a tabulku users, kde každý uživatel nemá svůj salt.
Vybereš si metodu - třeba bruteforce.
Seřadíš si hashe, aby se ti v nich dobře hledalo.
Postupně generuješ všechny kombinace znaků a pak u nich spočítáš hash nějak takhle:

$hash = hash($globalSalt.$guessedPass)

teď ti stačí najít v seřazených hashích stejnou hodnotu, pokud tam je (binárním vyhledáváním, to je hned) jedním vypočítáním hashe jsi otestoval všechny uživatele, jestli někdo z nich používá tohle heslo.

Když má každý ještě svůj unikátní salt, tak musíš pro každýho usera generovat hashe všech možných hesel s jeho unikátním saltem, takže ve výsledku ti lámání zabere mnohem mnohem víc času.

Snad jsem to popsal nějak pochopitelně, kdyžtak to ještě rozepíšu.

Nahoru Odpovědět
18.12.2012 14:24
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:18.12.2012 14:31
"Zvykni si na to, že u kvalitně udělaných databází není možné z tabulky vytáhnout heslo ani jeho hash"

Nezapomínej na lidský faktor - jako že si třeba někdo z firmy odnese db domů apod. :)

Nahoru Odpovědět
18.12.2012 14:31
https://www.facebook.com/peasantsandcastles/
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:18.12.2012 14:35

Napsal jsi to správně. Uznávám to. Pokud však použiješ jako usersalt jeho username, poslouží to stejně dobře.

Nahoru Odpovědět
18.12.2012 14:35
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:18.12.2012 14:38

"Nezapomínej na lidský faktor - jako že si třeba někdo z firmy odnese db domů apod."

Tohle jsi pochopil nesprávně. U kvalitně udělané databáze nefunguje select na zjištění hesla nebo jeho hashe. Prostě DB takový dotaz odmítne.

Nahoru Odpovědět
18.12.2012 14:38
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:18.12.2012 14:53

Username pouzit muzes taky, to je pravda :)

S takovou DB jsem se jeste nesetkal, zatim jsem delal ve firmach, kdy bylo nejvyssim levelem zabezpeceni to, ze se k hashovani pouzival salt, ale to je mozna tim, ze nejsem moc webar.
Rozhodne to ale zni dobre, tyhle data (salt+hash hesla) se nikdy jinde nez uvnitr v db zpracovavat nemusej.

Ono se v ceskych firmach na bezpecnost docela casto moc nehledi...

Nahoru Odpovědět
18.12.2012 14:53
https://www.facebook.com/peasantsandcastles/
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:18.12.2012 16:22

Takovou databází je například LDAP. Pro autentizaci i pro autorizaci se používá velmi často, protože je velmi rychlá. Nesrovnatelně rychlejší, než třeba MySQL.

Nahoru Odpovědět
18.12.2012 16:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.