web-dev-qa-db-fra.com

Création d'un utilisateur avec un mot de passe crypté dans PostgreSQL

Est-il possible de créer un utilisateur dans PostgreSQL sans fournir le mot de passe en texte brut (idéalement, je voudrais pouvoir créer un utilisateur fournissant uniquement son mot de passe crypté avec sha-256)?

Ce que je voudrais faire, c'est créer un utilisateur avec quelque chose comme ça:

CREATE USER "martin" WITH PASSWORD '$6$kH3l2bj8iT$KKrTAKDF4OoE7w.oy(...)BPwcTBN/V42hqE.';

Y a-t-il un moyen de le faire?

Merci de votre aide.

41
Martin

Vous pouvez fournir le mot de passe déjà haché avec md5, Comme indiqué dans le document ( CREATE ROLE ):

ENCRYPTED UNENCRYPTED Ces mots clés contrôlent si le mot de passe est stocké crypté dans les catalogues système. (Si aucun n'est spécifié, le comportement par défaut est déterminé par le paramètre de configuration password_encryption.) Si la chaîne de mot de passe présentée est déjà au format crypté MD5, elle est stockée cryptée telle quelle , indépendamment du fait que ENCRYPTED ou UNENCRYPTED soit spécifié (car le système ne peut pas déchiffrer la chaîne de mot de passe chiffrée spécifiée). Cela permet de recharger les mots de passe chiffrés lors du vidage/restauration.

Les informations qui manquent ici sont que la chaîne chiffrée MD5 doit être le mot de passe concaténé avec le nom d'utilisateur, plus md5 Au début.

Ainsi, par exemple, pour créer u0 Avec le mot de passe foobar, sachant que md5('foobaru0') est ac4bbe016b808c3c0b816981f240dcae:

CREATE USER u0 PASSWORD 'md5ac4bbe016b808c3c0b816981f240dcae';

puis u0 pourra se connecter en tapant foobar comme mot de passe.

Je ne pense pas qu'il existe actuellement un moyen d'utiliser SHA-256 Au lieu de md5 Pour les mots de passe PostgreSQL.

61
Daniel Vérité

Je ne suis pas au courant d'un moyen de remplacer le cryptage md5 par défaut des mots de passe, mais si vous avez un ROLE (aka "USER") qui a un mot de passe déjà crypté md5, il semble que vous pouvez le fournir. Vérifiez cela en utilisant pg_dumpall -g (pour voir les globales du cluster) Par exemple.

psql postgres
create role foo with encrypted password foobar;
\q

-- View the role from pg_dumpall -g
pg_dumpall -g | grep foo
CREATE ROLE foo;
ALTER ROLE foo WITH NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB NOLOGIN NOREPLICATION PASSWORD 'md5c98cbfeb6a347a47eb8e96cfb4c4b890';

Or get it from:
select * from pg_catalog.pg_shadow;

-- create the role again with the already-encrypted password
psql postgres
drop role foo;
CREATE ROLE foo;
ALTER ROLE foo WITH NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB NOLOGIN NOREPLICATION PASSWORD 'md5c98cbfeb6a347a47eb8e96cfb4c4b890';
\q

-- view the ROLE with the same password
pg_dumpall -g | grep foo
CREATE ROLE foo;
ALTER ROLE foo WITH NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB NOLOGIN NOREPLICATION PASSWORD 'md5c98cbfeb6a347a47eb8e96cfb4c4b890';

Documents pour CRÉER UN RÔLE

8
bma

La manière la plus simple d'y parvenir est:

CREATE USER u0 PASSWORD 'foobar';

select * from pg_catalog.pg_shadow;

Donne le mot de passe: md5ac4bbe016b808c3c0b816981f240dcae

2
Kamil D