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

PHP PHP PHP: Třída pro autorizaci a autentifikaci American English version English version

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Luboš Běhounek (Satik):

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
:)
Avatar
sdraco
Neregistrovaný
Avatar
Odpovídá na Luboš Běhounek (Satik)
sdraco:

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
Redaktor
Avatar
Odpovídá na sdraco
Kit:

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:

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
Redaktor
Avatar
Odpovídá na David Čápka
Kit:

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):

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
:)
Avatar
Odpovídá na Kit
Luboš Běhounek (Satik):
"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
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

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
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

"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):

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
:)
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Kit:

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.