]> granicus.if.org Git - postgresql/blob - src/test/regress/sql/password.sql
Fix use of term "verifier"
[postgresql] / src / test / regress / sql / password.sql
1 --
2 -- Tests for password types
3 --
4
5 -- Tests for GUC password_encryption
6 SET password_encryption = 'novalue'; -- error
7 SET password_encryption = true; -- ok
8 SET password_encryption = 'md5'; -- ok
9 SET password_encryption = 'scram-sha-256'; -- ok
10
11 -- consistency of password entries
12 SET password_encryption = 'md5';
13 CREATE ROLE regress_passwd1 PASSWORD 'role_pwd1';
14 SET password_encryption = 'on';
15 CREATE ROLE regress_passwd2 PASSWORD 'role_pwd2';
16 SET password_encryption = 'scram-sha-256';
17 CREATE ROLE regress_passwd3 PASSWORD 'role_pwd3';
18 CREATE ROLE regress_passwd4 PASSWORD NULL;
19
20 -- check list of created entries
21 --
22 -- The scram secret will look something like:
23 -- SCRAM-SHA-256$4096:E4HxLGtnRzsYwg==$6YtlR4t69SguDiwFvbVgVZtuz6gpJQQqUMZ7IQJK5yI=:ps75jrHeYU4lXCcXI4O8oIdJ3eO8o2jirjruw9phBTo=
24 --
25 -- Since the salt is random, the exact value stored will be different on every test
26 -- run. Use a regular expression to mask the changing parts.
27 SELECT rolname, regexp_replace(rolpassword, '(SCRAM-SHA-256)\$(\d+):([a-zA-Z0-9+/=]+)\$([a-zA-Z0-9+=/]+):([a-zA-Z0-9+/=]+)', '\1$\2:<salt>$<storedkey>:<serverkey>') as rolpassword_masked
28     FROM pg_authid
29     WHERE rolname LIKE 'regress_passwd%'
30     ORDER BY rolname, rolpassword;
31
32 -- Rename a role
33 ALTER ROLE regress_passwd2 RENAME TO regress_passwd2_new;
34 -- md5 entry should have been removed
35 SELECT rolname, rolpassword
36     FROM pg_authid
37     WHERE rolname LIKE 'regress_passwd2_new'
38     ORDER BY rolname, rolpassword;
39 ALTER ROLE regress_passwd2_new RENAME TO regress_passwd2;
40
41 -- Change passwords with ALTER USER. With plaintext or already-encrypted
42 -- passwords.
43 SET password_encryption = 'md5';
44
45 -- encrypt with MD5
46 ALTER ROLE regress_passwd2 PASSWORD 'foo';
47 -- already encrypted, use as they are
48 ALTER ROLE regress_passwd1 PASSWORD 'md5cd3578025fe2c3d7ed1b9a9b26238b70';
49 ALTER ROLE regress_passwd3 PASSWORD 'SCRAM-SHA-256$4096:VLK4RMaQLCvNtQ==$6YtlR4t69SguDiwFvbVgVZtuz6gpJQQqUMZ7IQJK5yI=:ps75jrHeYU4lXCcXI4O8oIdJ3eO8o2jirjruw9phBTo=';
50
51 SET password_encryption = 'scram-sha-256';
52 -- create SCRAM secret
53 ALTER ROLE  regress_passwd4 PASSWORD 'foo';
54 -- already encrypted with MD5, use as it is
55 CREATE ROLE regress_passwd5 PASSWORD 'md5e73a4b11df52a6068f8b39f90be36023';
56
57 -- This looks like a valid SCRAM-SHA-256 secret, but it is not
58 -- so it should be hashed with SCRAM-SHA-256.
59 CREATE ROLE regress_passwd6 PASSWORD 'SCRAM-SHA-256$1234';
60 -- These may look like valid MD5 secrets, but they are not, so they
61 -- should be hashed with SCRAM-SHA-256.
62 -- trailing garbage at the end
63 CREATE ROLE regress_passwd7 PASSWORD 'md5012345678901234567890123456789zz';
64 -- invalid length
65 CREATE ROLE regress_passwd8 PASSWORD 'md501234567890123456789012345678901zz';
66
67 SELECT rolname, regexp_replace(rolpassword, '(SCRAM-SHA-256)\$(\d+):([a-zA-Z0-9+/=]+)\$([a-zA-Z0-9+=/]+):([a-zA-Z0-9+/=]+)', '\1$\2:<salt>$<storedkey>:<serverkey>') as rolpassword_masked
68     FROM pg_authid
69     WHERE rolname LIKE 'regress_passwd%'
70     ORDER BY rolname, rolpassword;
71
72 -- An empty password is not allowed, in any form
73 CREATE ROLE regress_passwd_empty PASSWORD '';
74 ALTER ROLE regress_passwd_empty PASSWORD 'md585939a5ce845f1a1b620742e3c659e0a';
75 ALTER ROLE regress_passwd_empty PASSWORD 'SCRAM-SHA-256$4096:hpFyHTUsSWcR7O9P$LgZFIt6Oqdo27ZFKbZ2nV+vtnYM995pDh9ca6WSi120=:qVV5NeluNfUPkwm7Vqat25RjSPLkGeoZBQs6wVv+um4=';
76 SELECT rolpassword FROM pg_authid WHERE rolname='regress_passwd_empty';
77
78 -- Test with invalid stored and server keys.
79 --
80 -- The first is valid, to act as a control. The others have too long
81 -- stored/server keys. They will be re-hashed.
82 CREATE ROLE regress_passwd_sha_len0 PASSWORD 'SCRAM-SHA-256$4096:A6xHKoH/494E941doaPOYg==$Ky+A30sewHIH3VHQLRN9vYsuzlgNyGNKCh37dy96Rqw=:COPdlNiIkrsacU5QoxydEuOH6e/KfiipeETb/bPw8ZI=';
83 CREATE ROLE regress_passwd_sha_len1 PASSWORD 'SCRAM-SHA-256$4096:A6xHKoH/494E941doaPOYg==$Ky+A30sewHIH3VHQLRN9vYsuzlgNyGNKCh37dy96RqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=:COPdlNiIkrsacU5QoxydEuOH6e/KfiipeETb/bPw8ZI=';
84 CREATE ROLE regress_passwd_sha_len2 PASSWORD 'SCRAM-SHA-256$4096:A6xHKoH/494E941doaPOYg==$Ky+A30sewHIH3VHQLRN9vYsuzlgNyGNKCh37dy96Rqw=:COPdlNiIkrsacU5QoxydEuOH6e/KfiipeETb/bPw8ZIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=';
85
86 -- Check that the invalid secrets were re-hashed. A re-hashed secret
87 -- should not contain the original salt.
88 SELECT rolname, rolpassword not like '%A6xHKoH/494E941doaPOYg==%' as is_rolpassword_rehashed
89     FROM pg_authid
90     WHERE rolname LIKE 'regress_passwd_sha_len%'
91     ORDER BY rolname;
92
93 DROP ROLE regress_passwd1;
94 DROP ROLE regress_passwd2;
95 DROP ROLE regress_passwd3;
96 DROP ROLE regress_passwd4;
97 DROP ROLE regress_passwd5;
98 DROP ROLE regress_passwd6;
99 DROP ROLE regress_passwd7;
100 DROP ROLE regress_passwd8;
101 DROP ROLE regress_passwd_empty;
102 DROP ROLE regress_passwd_sha_len0;
103 DROP ROLE regress_passwd_sha_len1;
104 DROP ROLE regress_passwd_sha_len2;
105
106 -- all entries should have been removed
107 SELECT rolname, rolpassword
108     FROM pg_authid
109     WHERE rolname LIKE 'regress_passwd%'
110     ORDER BY rolname, rolpassword;