Det var ett tag sedan jag ställde den här frågan, och jag är mycket mer bekant med den kryptografiska teorin nu, så här är det mer moderna tillvägagångssättet:
Resonemang
- Använd inte md5. Använd inte en enda cykel av sha-familjens snabba hash. Snabba hash hjälper angripare, så det vill du inte.
- Använd en resurskrävande hash, som bcrypt, istället. Bcrypt är tidstestat och skalas upp för att vara framtidssäker.
- Tror inte på att rulla ditt eget salt, du kan förstöra din egen säkerhet eller portabilitet, lita på gen_salt() för att generera sina fantastiska unika salter för varje användning på egen hand.
- I allmänhet, var inte en idiot, försök inte skriva din egen hemodlade krypto, använd bara vad smarta människor har tillhandahållit.
Debian/Ubuntu installationspaket
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)
Aktivera crypt() och bcrypt i postgresql i din databas
// 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
Använd crypt() och gen_salt() i frågor
Jämför :pass till befintlig hash med:
select * from accounts where password_hash = crypt(:pass, password_hash);
//(note how the existing hash is used as its own individualized salt)
Skapa en hash av :lösenord med ett stort slumpmässigt salt:
insert into accounts (password) values crypt(:password, gen_salt('bf', 8));
//(the 8 is the work factor)
Från-i-Php bcrypt-hashning är något att föredra
Det finns password_*
funktioner i php 5.5 och senare som tillåter trivialt enkel lösenordshasning med bcrypt (på tiden!), och det finns ett bakåtkompatibilitetsbibliotek för versioner under det. Allmänt att hashing faller tillbaka till att slå in ett linux-systemanrop för lägre CPU-användning ändå, även om du kanske vill se till att det är installerat på din server. Se:https://github.com/ircmaxell/password_compat (kräver php 5.3.7+)
Var försiktig med att logga
Observera att med pg_crypto är lösenorden i klartext allt under överföringen från webbläsaren till php till databasen. Det betyder att de kan loggas i klartext från frågor om du inte är försiktig med dina databasloggar. t.ex. att ha en långsam postgresql-frågelogg kan fånga och logga lösenordet från en pågående inloggningsfråga.
I sammanfattning
Använd php bcrypt om du kan, det kommer att förkorta den tid som lösenordet förblir unhashat. Försök att se till att ditt linuxsystem har bcrypt installerat i dess crypt()
så det är prestanda. Uppgradering till minst php 5.3.7+ rekommenderas starkt eftersom phps implementering är något buggig från php 5.3.0 till 5.3.6.9, och på ett olämpligt sätt faller tillbaka till den trasiga DES
utan förvarning i php 5.2.9 och lägre.
Om du vill ha/behöver hashning i postgres, är installation av bcrypt rätt väg att gå, eftersom de standardinstallerade hasharna är gamla och trasiga (md5, etc).
Här är referenser för mer läsning om ämnet:
- 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