Ako správne hashovať heslo

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
iGavrilo
Člen | 32
+
0
-

Zdravím komunitu,

Skúšam si robiť svoje prvé „čmáraniny“ v nette a natrafil som na jeden problém. Vytvoril som si jednoduchú registráciu a zaujímalo by ma, ako čo najlepšie (za)hash(ovať) heslo.

A ďalšia moja otázka znie ako riešite to aby sa vám nezaregistrovali 2 rôzny užívatelia s rovnakým menom. Okrem toho že v databáze nastavíte UNIQUE.

Ďakujem všetkým za pomoc

Editoval iGavrilo (15. 12. 2015 20:49)

premek_k
Člen | 172
+
+2
-

Skúšam si robiť svoje prvé „čmáraniny“ v nette a natrafil som na jeden problém. Vytvoril som si jednoduchú registráciu a zaujímalo by ma, ako čo najlepšie (za)hash(ovať) heslo.

K tomu bych ti doporučil toto video: https://www.michalspacek.cz/…ofit-develcz

A ďalšia moja otázka znie ako riešite to aby sa vám nezaregistrovali 2 rôzny užívatelia s rovnakým menom. Okrem toho že v databáze nastavíte UNIQUE.

Já nijak. Proč by nemohlo být registrováno více uživatelů se stejným jménem?

iGavrilo
Člen | 32
+
+1
-

To bol príklad samozrejme napríklad Email by už mal byť unikátny ako to riešiš v tomto prípade. Ja by som niečo polepil len ma zaujíma ten správny postup.

CZechBoY
Člen | 3608
+
+2
-

Udělám si unikátní klíč v databázi. Při registraci si kontroluju jestli už takovej email není v databázi.
Případně pokud to je jedinej unikátní klíč v tabulce tak můžeš zkontrolovat jestli náhodou není vyhozena vyjímka UniqueConstraintViolationException

Jinak autentizace + registrace třeba viz sandbox: https://github.com/…rManager.php

Editoval CZechBoY (15. 12. 2015 22:58)

iGavrilo
Člen | 32
+
+1
-

Toto mi je všetko jasné, len niekde som čítal že sa používa Nette\Security\Passwords, tak som chcel vedieť také to Know-How.

CZechBoY
Člen | 3608
+
+2
-

Ukázka Nette Password je v UserManageru, viz můj předchozí post.

iGavrilo
Člen | 32
+
-1
-

Mohol by mi to niekto ukázať na príklade ?

Aurielle
Člen | 1281
+
+2
-

@iGavrilo: příklad máš na tom linku, který sem už házel @CZechBoY. Pro jistotu znovu, tady: https://github.com/…rManager.php

Vastlik
Člen | 58
+
+3
-

Rozhodne bych nepouzil sha256, používej spíš bcrypt. Osobně bych použil nativní funkce Nette nebo PHP.

Zuben45
Člen | 268
+
0
-

Vastlik napsal(a):

Rozhodne bych nepouzil sha256, používej spíš bcrypt. Osobně bych použil nativní funkce Nette nebo PHP.

sha256 jsem používal kvůli napojení na Minecraft systém (přihlašování na mc server,nakupování apod..), a už mi to zůstalo :). Jinak díky za radu, určo si s tím zkusím pohrát :)

PS: Proč by mělo být více uživatelů se stejným jménem ? Vždyť se jedná o přihlašovací jméno a to by mělo být unikátní ne? Příklad: někdo kdo má stejné jméno si splete heslo a čirou náhodou se přihlásí na jiného uživatele. Vím, že je strašně malá pravděpodobnost, ale i tak, a navíc je lepší uživatele rozlišovat podle jméno například kvůli fóru :)

Editoval Zuben45 (17. 12. 2015 8:57)

Vastlik
Člen | 58
+
+1
-

Zapomněl jsem poslat zdroj. http://crypto.stackexchange.com/…vs-hash-salt
Jinak důvod proč používat bcrypt je z důvodu toho, že jeho algoritmus je navržen na tvorbu hesel, takže je naschvál pomalejší a chrání tak proti crackovani bruteforce.

Zuben45
Člen | 268
+
0
-

Vastlik napsal(a):

Zapomněl jsem poslat zdroj. http://crypto.stackexchange.com/…vs-hash-salt
Jinak důvod proč používat bcrypt je z důvodu toho, že jeho algoritmus je navržen na tvorbu hesel, takže je naschvál pomalejší a chrání tak proti crackovani bruteforce.

ach tak :), koukám že PHP už toto využívá v fcích http://php.net/…password.php :)

Jen teď budu muset překopat všechny uživatelské hesla :), napadá mě akorát využití fce na hesla co mám a ten obalit do

password_hash

Editoval Zuben45 (17. 12. 2015 9:14)

Vastlik
Člen | 58
+
+1
-

Spíš to je něco do budoucnosti :) ale hesla muzes samozřejmě prekopat. Myslím, že by bylo lepší neobalovat a prostě napsat hashovani a ověřování znova.

Oli
Člen | 1215
+
+2
-

@Zuben45 koukal jsi sem? https://github.com/…rManager.php#L49. Staci pouzit tu tridu Passwords a pokud bude nevyhovujici hash, tak ti to prehashuje

Zuben45
Člen | 268
+
0
-

Oli napsal(a):

@Zuben45 koukal jsi sem? https://github.com/…rManager.php#L49. Staci pouzit tu tridu Passwords a pokud bude nevyhovujici hash, tak ti to prehashuje

Myslíš že to zvládne i jak to mám přes vl. fci calculateHash ? :)

PS: Nechápu za co Dislike (https://forum.nette.org/…shovat-heslo#…), jen se snažím pomoct… :/

Editoval Zuben45 (17. 12. 2015 10:02)

CZechBoY
Člen | 3608
+
0
-

@Zuben45 NIkde tam opravu hashe nevidim, takže nezvládne.
Minusy máš za to, že

  1. vkládáš celkem nečitelnej kod
  2. napojení na již existující systém, na který se tazatel neptal
  3. nechápu jak můžeš mít dvě funkce calculateHash, když by měl bejt výsledek hashování vždycky stejnej
Vastlik
Člen | 58
+
0
-

@Zuben45 ta funkce dělá to, že veme hash co mas zjistí, jestli sedí s algoritmem co používas a pokud ne, prehashuje ho.
Myslim, že takhle funguje, možná mě někdo opraví.
Takže by to mělo fungovat i na tvůj algoritmus. :)

Zuben45
Člen | 268
+
0
-

CZechBoY napsal(a):

@Zuben45 NIkde tam opravu hashe nevidim, takže nezvládne.
Minusy máš za to, že

  1. vkládáš celkem nečitelnej kod
  2. napojení na již existující systém, na který se tazatel neptal
  3. nechápu jak můžeš mít dvě funkce calculateHash, když by měl bejt výsledek hashování vždycky stejnej

Aha, no mělo to být jen jako ukázka. za 2. bod se omlouvám a u 3. Musí tam být dva a to kvůli této části u registrace:

for ($i = 0; $i < 17; $i++) {
        $n = rand(0, $alphaLength);
        $pass[] = $alphabet[$n];
      }

Vastlik napsal(a):

@Zuben45 ta funkce dělá to, že veme hash co mas zjistí, jestli sedí s algoritmem co používas a pokud ne, prehashuje ho.
Myslim, že takhle funguje, možná mě někdo opraví.
Takže by to mělo fungovat i na tvůj algoritmus. :)

Dobře, díky moc, určitě vyzkouším.

Editoval Zuben45 (17. 12. 2015 11:47)