Postgres: пароль MD5/простой пароль

Я пытаюсь понять, как пароли ролей должны работать в Postgres.

https://www.postgresql.org/docs/current/static/sql-createrole.html говорит для ЗАШИФРОВАННЫХ/НЕЗАШИФРОВАННЫХ

Если представленная строка пароля уже находится в зашифрованном формате MD5, то она сохраняется зашифрованной как есть,

Итак, мой незашифрованный пароль: MyPassword.

Хэш MD5 «MyPassword»: 48503dfd58720bd5ff35c102065a52d7.

If I do

-- See https://www.postgresql.org/docs/9.6/static/sql-alterrole.html
ALTER ROLE "MeOhMy"
LOGIN
PASSWORD '48503dfd58720bd5ff35c102065a52d7'
;

А затем попытайтесь использовать «MyPassword» при выполнении

  sudo -u postgres psql meohmy -h 127.0.0.1 -d meohmy_development

Я, конечно, сначала получаю запрос на мой пароль sudo, а затем мне предлагается Postgres «Пароль для meohmy»

Если я ввожу MyPassword, я получаю

FATAL:  password authentication failed for user "[email protected]"

Если вместо этого я введу 48503dfd58720bd5ff35c102065a52d7, то смогу войти.

Что я не понимаю?


person RalphShnelvar    schedule 30.07.2017    source источник
comment
MD5 не является шифрованием, поскольку хэш-функция не является шифрованием, это односторонние необратимые методы. Шифрование предполагает расшифровку, что с помощью правильного ключа зашифрованные данные могут быть возвращены в их незашифрованное состояние.   -  person zaph    schedule 30.07.2017
comment
MD5 не является безопасным или приемлемым средством проверки пароля. При сохранении средства проверки пароля простого использования хеш-функции недостаточно, а простое добавление соли мало что дает для повышения безопасности. Вместо этого повторите HMAC со случайной солью в течение примерно 100 мс и сохраните соль с хэшем. Используйте такие функции, как PBKDF2, Rfc2898DeriveBytes, password_hash, Bcrypt, passlib.hash или аналогичные функции. Смысл в том, чтобы заставить злоумышленника потратить много времени на поиск паролей методом перебора.   -  person zaph    schedule 30.07.2017
comment
Хотя вы абсолютно правы в обоих своих комментариях, есть два соображения: 1) я ограничен возможностями, которые дает мне Postgres. 2) Данные, которые я защищаю, не так уж ценны, поэтому тратить время на их защиту с высочайшим уровнем безопасности просто не стоит.   -  person RalphShnelvar    schedule 31.07.2017


Ответы (4)


Чтобы создать пароль md5 для PostgreSQL, используйте следующую формулу:

"md5" + md5(password + username)

Вот 3 способа создать его, где имя пользователя "admin" и пароль "password123"...

Линукс:

# echo -n "md5"; echo -n "password123admin" | md5sum | awk '{print $1}'
md53f84a3c26198d9b94054ca7a3839366d

ПРИМЕЧАНИЕ. Параметр -n имеет решающее значение, чтобы избежать включения символа новой строки в ваш хэш!

MacOS:

➜ echo -n "md5"; md5 -qs "password123admin"                                                                                                                                                                                   
md53f84a3c26198d9b94054ca7a3839366d

Питон 2:

>>> import hashlib
>>> print("md5" + hashlib.md5("password123" + "admin").hexdigest())
md53f84a3c26198d9b94054ca7a3839366d

Питон 3:

как указано выше, но используйте двоичные строки

print("md5" + hashlib.md5(b"password123" + b"admin").hexdigest())
person RCross    schedule 21.11.2019

Хэшированные пароли Postgresql имеют префикс md5:

md548503dfd58720bd5ff35c102065a52d7
person zerkms    schedule 30.07.2017
comment
Где это задокументировано!!!? Все, что я нашел, это stackoverflow.com/questions/14918763/ - person RalphShnelvar; 30.07.2017
comment
@RalphShnelvar postgresql.org/docs/current/static/catalog- pg-authid.html - person gilad mayani; 13.02.2018

Использование Postgres11 в GCP Cloud SQL. Версия Gitlab gitlab-ee 13.3.4 Установка Omnibus

# gitlab-ctl pg-password-md5 gitlab_user
Enter password:
Confirm password:

и

# echo -n <password for gitlab_user>gitlab_user | md5sum

эквивалентны.

Примечание. Мой пользователь базы данных gitlab_user

person Ankur Agarwal    schedule 14.09.2020

Ответ, предоставленный @zerkms, частично верен. Это привело меня к правильному ответу.

Ответ, представленный в Создание пароля пользователя postgresql, является ответом, который работает для меня.

person RalphShnelvar    schedule 30.07.2017
comment
Просто ссылки недостаточно, она не в полной мере поможет будущим читателям и может стать недействительной. - person zaph; 30.07.2017
comment
Хорошо ... для будущих читателей в статье, на которую я указал, говорится: pghash = "md5" + hashlib.md5(password + username).hexdigest() - person RalphShnelvar; 31.07.2017