2013-02-17 15 views
11

Ho provato a generare la password per postgres utilizzando hashlib da Python.Generazione della password utente postgresql

>>> import hashlib 
>>> hashlib.md5("psql123").hexdigest() 
2636d1ddc54901f98d011ffe050c0eb7 

Ma PostgreSQL richiede md5 prefisso, così poi

sudo -u postgres psql 
ALTER USER postgres PASSWORD 'md52636d1ddc54901f98d011ffe050c0eb7'; 

Tuttavia, l'autenticazione potrebbe non riuscire se uso psql123 come password.

Se uso passlib, sto bene. Vedere http://pythonhosted.org/passlib/lib/passlib.hash.postgres_md5.html

Fare quanto segue utilizzando psql123 come password è okay.

ALTER USER postgres PASSWORD 'md556074e7318bd4cee558faab0678a2fad'; 

Non capisco quello che l'avviso in passlib voglio dire. Va bene usare questo hash per l'utente postgres? Inoltre, dove nel documento si dice che username deve essere parte dell'input?

Suppongo che questo sia il motivo per cui postgres non è in grado di comprendere il risultato da hashlib. Come utente LDAP, posso generare una password nella shell. Postgres ha un comando integrato per farlo? Lo ha psycopg2? Sembra che non sia così.

risposta

16

Postgres' è molto vicino a quello che hai fatto, ha solo bisogno il nome utente da inserire nel seguente modo:

AFAIK, i documenti postgres in realtà non documentano affatto questo formato di hash e sembrano presupporre che gli amministratori raramente gestiranno direttamente questi hash :(Non ci sono metodi incorporati per i generi con questi hash che io conosco. Se la password fornita per il comando ALTER USER non è conforme al formato hash di postgres, si presuppone che la password non sia stata sottoposta a hash e ne prenda cura internamente - secondo la documentazione per la parola chiave ENCRYPTED di CREATE ROLE. (IMHO questo è un comportamento imperfetto, perché se un hash dipende dal nome utente, significa che gli hash non possono essere copiati e incollati tra diversi account, interrompersi quando l'account viene rinominato, e (indovinando entropia saggia) ha solo ~ 6 bit di sale efficace).

L'avviso nella parte superiore della documentazione di passlib per l'hash potrebbe probabilmente essere più chiaro. Lo scopo era avvertire le persone che navigavano nella documentazione del passlib che 1) questo hash era orribilmente insicuro, 2) che non dovevano adottarlo per l'uso nelle proprie applicazioni, e 3) che era adatto solo allo scopo di lavorare con postgres account utente, dal momento che è il più forte (e solo) hash in formato Postgres supporta per i propri account.

(Se si sta tentando di utilizzare Postgres per le password hash per gli account utente della propria applicazione, vorrei fortemente raccomandare a Clodoaldo di utilizzare bcrypt tramite l'estensione pgcrypto).

+0

Grazie mille. Invito entrambi, ma dal momento che hai risposto a tutte le mie preoccupazioni, ti controllerò. Ma ringrazio entrambi. NO, l'hash è solo per l'account utente 'postgres', non per l'account utente app. Questo tipo di hash mi ricorda le due ingenue costruzioni MAC che conducono ad attacchi di estensione/lunghezza, es. – CppLearner

5
alter user postgres ENCRYPTED password 'psql123'; 

Per altri usi utilizzare il modulo pgcrypto.

create table "user" (name text, password_hash text); 

insert into "user" (name, password_hash) values 
('u1', crypt('psql123', gen_salt('bf'))); 

select * from "user"; 
name |      password_hash       
------+-------------------------------------------------------------- 
u1 | $2a$06$SeH4u4aRtT2Zr39er4eSiONT/0IBQHYMbQXn2RauPJKCYdNX1.58G 

select name, password_hash = crypt('psql123', password_hash) 
from "user" 
; 
name | ?column? 
------+---------- 
u1 | t 

Installarlo come super utente registrato nel database di destinazione: hash della password

create extension pgcrypto; 
+0

Hey, grazie mille! Controllerò pgcrypto più tardi. Informazioni molto utili. – CppLearner

+0

funziona solo con fascino.non può meglio di così – tsohr

Problemi correlati