Password generator i PHP

Tags:    php password patterns

Hej
Jeg har behov for at lave en funktion der opretetter en tilfældig blanding af store bogstaver, små bogstaver, tal og specialtegn (uden at bruge / \ " '). Jeg for lidt over et år siden anvendt følgende kode til at lave en streng bestående af netop disse typer tegn som er nævnt ovenfor.
Fold kodeboks ind/udPHP kode 

Problemet med dette script er at man definerer et fast antal tegn af hver type og så vælges der tilfældigt det definerede antal tegn fra hver type.
Da scriptet skal bruges til at lave en salt på 64 tegn vil jeg jo gerne have at det er så tilfældigt som muligt for at hver website har sin egen salt-værdi.
Jeg har fundet siden strongpasswordgenerator.com som gør dette via JavaScript.
Jeg går ud fra at ovenstående funktion kan genbruges med lidt modifikationer, da jeg gerne vil bruge den til andre formål end 64 tegn salt-værdier. Det kunne jo være interessant til password recovery.



Indlæg senest redigeret d. 13.11.2013 17:01 af Bruger #17072
7 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 10 karma
Sorter efter stemmer Sorter efter dato
@Robert
Hvis jeg vil anvende salt pr. bruger så skal jeg jo gemme dem i databasen sammen med resten af brugerens oplysninger. Er det korrekt forstået?

Korrekt. Men output fra crypt() funktionen indeholder tre ting:
1) Hashet af dit password
2) Algoritmen, som blev brugt
3) Det benyttede salt

Altsammen som én streng. F.eks:
Fold kodeboks ind/udPHP kode 

Output af ovenstående er (i mit tilfælde):
Fold kodeboks ind/udKode 


Det er den streng du gemmer i databasen. Når du så skal tjekke, om et givet password var korrekt henter du strengen ud igen og gør følgende:
Fold kodeboks ind/udPHP kode 


Bruger du det samme salt for alle brugere, så kan man lave et statistisk angreb. Har du mange brugere, vil en hel del af dem have det samme password, og bruges samme salt for alle brugere, så vil de også have samme hash. Så søger man bare efter det oftest forekomne hash, og det passer sandsynligvis sammen med et af de oftest forekomne passwords.
Det problem fixer man med dynamisk hash.

Derudover hasher crypt() funktionen pr. default 5000 gange. Det giver ikke som sådan ekstra sikkerhed, men det vil tage 5000 gange så lang tid at brute force.



Indlæg senest redigeret d. 14.11.2013 14:14 af Bruger #2695
Hej Kenneth,

Jeg brugte i sin tid følgende funktion til at generer et "tilfældigt" kodeord:

Fold kodeboks ind/udPHP kode 


Du kan tage et kig på den, og se om det er noget du kan bruge :-)

vh,



Indlæg senest redigeret d. 13.11.2013 21:26 af Bruger #16122
$hash = substr(sha1(uniqid()),0,64);

Eller du kan bruge:
http://stackoverflow.com/questions/1846202/php-how-to-generate-a-random-unique-alphanumeric-string


Hvis du vil have noget der er mere kryptisk kan du kigge på:
http://us2.php.net/manual/en/book.mcrypt.php



Indlæg senest redigeret d. 13.11.2013 19:57 af Bruger #10216
Lad nu være med at have en statisk salt. Det er kun marginalt bedre end slet ikke at salte.
Brug en ny salt for hver bruger istedet, og det gør crypt() funktionen for dig.



Tak for jeres input.

Lad nu være med at have en statisk salt. Det er kun marginalt bedre end slet ikke at salte.
Brug en ny salt for hver bruger istedet, og det gør crypt() funktionen for dig.

@Robert
Hvis jeg vil anvende salt pr. bruger så skal jeg jo gemme dem i databasen sammen med resten af brugerens oplysninger. Er det korrekt forstået?




Ok. Blot så jeg forstår det helt korrekt så viser du i dit eksempel at når jeg trækker data ud fra databasen ved f.eks. at logge en bruger ind så vil $password være lig det brugeren har indtastet og $hashed er det der står i databasen. Er dette korrekt forstået?

For at sammenligne de to værdier skal jeg bruge crypt funktionen til at hashe det indtastede password og validere op mod den værdi der findes i databasen. Det eneste jeg ikke helt forstår er hvorfor der i dit if-statement står crypt($password, $hashed). Er det fordi vi ønsker at passwordet skal hashes efter sammen syntaks som den streng der findes i databasen?



Crypt funktionen skal have både det indtastede password og det aktuelle "hash" fordi det aktuelle hash indeholder saltet. Så for at kunne salte det indtastede password korrekt skal crypt kende det oprindelige salt.

Lidt (meget) forsimplet kunne man forestille sig at crypt er implementeret ca. således:
Fold kodeboks ind/udPHP kode 


Det er en meget forsimplet version. Hvis du kigger i dokumentationen til crypt() vil du se, at du også kan specificere hashing algoritmen via det andet argument.

Men når du skal tjekke et password op imod det, som du har i databasen, så skal du bruge det eksisterende fordi det indeholder det salt, som blev genereret, da brugeren blev oprettet eller da han sidst ændrede password.



t