sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan kan jeg hash kodeord i postgresql?

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


  1. Hvordan tilføjer du PostgreSQL Driver som en afhængighed i Maven?

  2. Sådan opdaterer du rækker med en tilfældig dato

  3. Sådan installeres PostgreSQL 12 på Fedora 33

  4. Vil du oprette forbindelse til MS SQL Server med Windows-godkendelse ved hjælp af Python?