Создание пароля пользователя postgresql

Я попытался сгенерировать пароль для postgres с помощью hashlib из Python.

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

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

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? Похоже, что нет.

Ответ 1

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

 pghash = "md5" + hashlib.md5(password + username).hexdigest()

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

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

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

Ответ 2

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;