Как сгенерировать SCRAM-SHA-256 для создания пользователя Postgres 13

Я хочу создать пользователя Postgres с помощью команды CREATE USER и уже хешированного дайджеста для пароля. После долгих поисков я подумал, что это возможно только с MD5, пока не нашел эта ссылка. Я проверил, что работает так:

CREATE USER test_user WITH LOGIN PASSWORD 'SCRAM-SHA-256$4096:H45+UIZiJUcEXrB9SHlv5Q==$I0mc87UotsrnezRKv9Ijqn/zjWMGPVdy1zHPARAGfVs=:nSjwT9LGDmAsMo+GqbmC2X/9LMgowTQBjUQsl45gZzA=';

Затем я могу войти в систему этого пользователя с паролем, который не обязательно указан в статье, но это postgres. Теперь, когда я знаю, что это возможно, как с помощью .NET 5 сгенерировать дайджест scram-sha-256, который примет Postgres 13? Я видел другие статьи Postgres, использующие устаревший хэш MD5, где имя пользователя объединяется с паролем перед хешированием. Должно ли это происходить и с новым скрам-ша-256? Я нигде не мог найти много информации по этой теме.


person kuja    schedule 15.07.2021    source источник
comment
У меня нет ответа на ваш вопрос, но вот ссылка, которая более подробно описывает строку пароля SCRAM: postgresql.org/docs/13/catalog-pg-authid.html (см. внизу этой страницы). Также я думаю, вы могли бы посмотреть исходный код PostgreSQL, чтобы узнать, как шифруется пароль при установке пароля с помощью команды \password или при создании пользователя с помощью createuser someuser --login --pwprompt.   -  person mkurz    schedule 21.07.2021


Ответы (1)


Я не знаю, как сгенерировать дайджест scram-sha-256 с помощью .NET 5. Однако, если дайджест scram-sha-256 — это все, что вам нужно, вы можете использовать обходной путь, создав фиктивного пользователя postgres локально и повторив зашифрованное пароль командой createuser.

Например (обычно вы запускаете это как пользователь postgres Linux: su postgres):

$ createuser dummyuser -e --pwprompt
Enter password for new role: 
Enter it again: 
SELECT pg_catalog.set_config('search_path', '', false);
CREATE ROLE dummyuser PASSWORD 'SCRAM-SHA-256$4096:VnimR0aOywxZzY82nzy9Fg==$qF9uMCU6YsKoecvRjP8jSmZZxrXgn5VwzhHwfoWo5Xg=:xGYfBUvGsu9mZFiq1nSFaHi7uN8n47IDwHO32IeK9io=' NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;

Теперь вы можете просто скопировать дайджест в свой запрос. Конечно, это работает только в том случае, если вам не нужно динамически генерировать дайджест с помощью .NET.

Не забудьте удалить фиктивного пользователя:

$ dropuser dummyuser

Кроме того, если ваша локальная база данных postgres все еще использует/генерирует md5, вы должны изменить это на scram, используя следующий запрос, запущенный как суперпользователь postgres:

ALTER SYSTEM SET password_encryption = 'scram-sha-256';
SELECT pg_reload_conf();

Однако, если вы хотите создать дайджест динамически с помощью .NET, я рекомендую вам взглянуть на исходный код команды createuser...

Обновить через день:

Вот конкретный исходный код команды createuser, которая шифрует пароль в строку scram-sha-256:

Чтобы облегчить жизнь, вот ссылки на функции (возможно, не все), которые вызывает вышеуказанная функция

Вы должны иметь возможность переписать этот код на .NET или любом другом языке. Надеюсь, поможет!

person mkurz    schedule 21.07.2021
comment
Да, я думаю, вы правы, и я подумал, что мне, возможно, придется пойти по этому пути и в этот момент. В C# не так уж много SASL-библиотек, которые мне бы очень хотелось использовать. Приятно то, что исходный код, на который вы ссылаетесь, содержит все недопустимые символы нормализации Unicode в одном месте, и я пытался перечислить их все из страница документов RFC3454. Это быстро превратилось в кошмар. Единственное, о чем мне интересно, это действительно ли мне нужно делать все это, если я использую Postgres SSL, а мой сервер базы данных не является общедоступным. - person kuja; 22.07.2021
comment
Возможно, я просто добавляю уровни безопасности и создаю себе ненужную работу. Мне нужно подумать над этим, но если я перенесу его на C#, я сделаю код доступным для других. - person kuja; 22.07.2021