2013-02-17 6 views
11

Я попытался сгенерировать пароль для postgres, используя hashlib с Python.Генерирование пароля пользователя postgresql

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

Но требует md5 PostgreSQL префикса, поэтому затем

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

Однако аутентификация потерпит неудачу, если я использую psql123 в качестве пароля.

Если я использую passlib, я в порядке. См. http://pythonhosted.org/passlib/lib/passlib.hash.postgres_md5.html

Выполнение следующих операций с использованием psql123, поскольку пароль в порядке.

ALTER USER postgres PASSWORD 'md556074e7318bd4cee558faab0678a2fad'; 

Я не понимаю, что предупреждение в passlib хочу сказать. Можно ли использовать этот хэш для пользователя postgres? Кроме того, где в документе говорится: username должен быть частью ввода?

Я предполагаю, что именно поэтому postgres не может понять результат от hashlib. Как пользователь LDAP, я могу сгенерировать пароль в оболочке. У Postgres есть встроенная команда для этого? Есть ли у psycopg2? Похоже, что нет.

ответ

16

Postgres' хэш пароля очень близко к тому, что вы сделали, это просто нужно имя пользователя должны быть включены следующие:

AFAIK, документы postgres на самом деле не документируют этот хеш-формат, и, похоже, администраторы редко справляются с этими хэшами напрямую :(Нет встроенных методов для родов которые я знаю. Если пароль, предоставленный команде ALTER USER, не соответствует формату хэша postgres, он предполагает, что пароль не был хэширован, и позаботится об этом внутренне - для документов для ключевого слова ENCRYPTED CREATE ROLE. (IMHO это ошибочное поведение, потому что, если хеш зависит от имени пользователя, это означает, что хеши нельзя копировать и вставлять между разными учетными записями, ломаться, когда учетная запись переименовывается, и (угадывая энтропийную мудрую) имеет только ~ 6 бит эффективная соль).

Предупреждение в верхней части документации passlib для хэша, вероятно, может быть более четким. Он должен был предупредить людей, просматривающих документацию passlib, что 1) этот хэш был ужасно неуверенным, 2) что они не должны принимать его для использования в своих собственных приложениях и 3) что он подходит только для работы с postgres, поскольку он является самым сильным (и единственным) хэш-форматом postgres для собственных учетных записей.

(Если вы пытаетесь использовать postgres для хеш-паролей для учетных записей своих собственных приложений, я бы настоятельно рекомендовал вторую рекомендацию Clodoaldo использовать bcrypt посредством расширения pgcrypto).

+0

Большое спасибо. Я поддерживаю вас обоих, но, поскольку вы ответили на все мои вопросы, я проверю вас. Но я благодарю вас обоих. НЕТ, хеш предназначен только для учетной записи пользователя postgres', а не для учетной записи пользователя приложения. Этот вид хэша напоминает мне две наивные структуры MAC, которые приводят к атаке расширения/длины, т.е. – CppLearner

5
alter user postgres ENCRYPTED password 'psql123'; 

Для других целей используйте модуль 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 

Установите его в качестве супер-пользователя, вошедшего в целевой базе данных:

create extension pgcrypto; 
+0

Привет, большое спасибо! Я проверю pgcrypto позже. Очень полезная информация. – CppLearner

+0

это просто работает с очарованием.не может быть лучше этого. – tsohr

Смежные вопросы