Det er et stykke tid siden, jeg stillede dette spørgsmål, og jeg er meget mere fortrolig med den kryptografiske teori nu, så her er den mere moderne tilgang:
Begrundelse
- Brug ikke md5. Brug ikke en enkelt cyklus af sha-familiens hurtige hashes. Hurtige hashes hjælper angribere, så det ønsker du ikke.
- Brug en ressourcekrævende hash, såsom bcrypt, i stedet. Bcrypt er tidstestet og skaleres op til at være fremtidssikret.
- Gid ikke at rulle dit eget salt, du kan ødelægge din egen sikkerhed eller portabilitet, stol på gen_salt() til at generere det fantastiske unikke salte til hver brug alene.
- Generelt, vær ikke en idiot, prøv ikke at skrive din egen hjemmelavede krypto, brug bare hvad smarte mennesker har leveret.
Debian/Ubuntu installationspakker
sudo apt-get install postgresql // (of course)
sudo apt-get install postgresql-contrib libpq-dev // (gets bcrypt, crypt() and gen_salt())
sudo apt-get install php5-pgsql // (optional if you're using postgresql with php)
Aktiver crypt() og bcrypt i postgresql i din database
// Create your database first, then:
cd `pg_config --sharedir` // Move to the postgres directory that holds these scripts.
echo "create extension pgcrypto" | psql -d yOuRdATaBaSeNaMe // enable the pgcrypo extension
Brug crypt() og gen_salt() i forespørgsler
Sammenlign :pass til eksisterende hash med:
select * from accounts where password_hash = crypt(:pass, password_hash);
//(note how the existing hash is used as its own individualized salt)
Opret en hash af :password med et stort tilfældigt salt:
insert into accounts (password) values crypt(:password, gen_salt('bf', 8));
//(the 8 is the work factor)
Fra-i-Php bcrypt hashing er lidt at foretrække
Der er password_*
funktioner i php 5.5 og nyere, der tillader trivielt simpel adgangskode-hashing med bcrypt (på tide!), og der er et bagudkompatibilitetsbibliotek for versioner under det. Generelt at hashing falder tilbage til at indpakke et linux-systemopfordring til lavere CPU-brug alligevel, selvom du måske vil sikre dig, at det er installeret på din server. Se:https://github.com/ircmaxell/password_compat (kræver php 5.3.7+)
Vær forsigtig med at logge
Bemærk, at med pg_crypto er adgangskoderne i klartekst alt under overførslen fra browseren til php til databasen. Det betyder, at de kan logges i almindelig tekst fra forespørgsler, hvis du ikke er forsigtig med dine databaselogfiler. for eksempel. at have en postgresql langsom forespørgselslog kunne fange og logge adgangskoden fra en login-forespørgsel i gang.
Oversigt
Brug php bcrypt, hvis du kan, det vil mindske den tid, hvor adgangskoden forbliver unhashed. Prøv at sikre, at dit linux-system har bcrypt installeret i dets crypt()
så det er performant. Opgradering til mindst php 5.3.7+ anbefales stærkt, da php's implementering er lidt buggy fra php 5.3.0 til 5.3.6.9 og falder uhensigtsmæssigt tilbage til den ødelagte DES
uden advarsel i php 5.2.9 og lavere.
Hvis du ønsker/har brug for in-postgres hashing, er installation af bcrypt vejen at gå, da de standard installerede hashes er gamle og ødelagte (md5 osv.).
Her er referencer til mere læsning om emnet:
- http://codahale.com/how-to-safely-store-a-password/
- http://www.postgresql.org/docs/9.2/static/pgcrypto.html
- https://github.com/ircmaxell/password_compat