pg-password-util
v1.0.0
Published
Client-side encoding of PostgreSQL user passwords for use in CREATE USER and ALTER USER
Maintainers
Readme
pg-password-util
Overview
Utility library for password encoding for PostgreSQL.
This solves the problem of plaintext passwords appearing in server logs by replacing:
ALTER USER app PASSWORD 'Super Duper Secret!'With the password encoded client side:
ALTER USER app PASSWORD 'SCRAM-SHA-256$4096:M1A3zTFR9TzaX5NuvytilQ==$TZtMCtrZ8wkkZVkS7vursem77PsBqthl8GqkPohscJw=:POfEEJ9BOrm6upeAFKU3awWqMg+kKYXyPOG5E5tuhJc='That hashed value does not contain the plaintext of the password and matches how PostgreSQL stores the value in pg_shadow.
Install
$ npm install pg-password-utilDependencies
The only direct dependency is pg-format used to escape literals and identifiers.
The ALTER USER helpers accept a client argument that must provide the same signature as pg.Client (i.e. the client from the pg node-postgres driver). It's not a direct dependency of this module though.
Features
- Encoding passwords using SCRAM-SHA-256 (recommended)
- Encoding passwords using md5 (for legacy systems)
- Generating SQL to change a user's password
- Inferring the password_encryption from the target database
Usage
Generate SQL for an ALTER USER to change a password
import { genAlterUserPasswordSql } = require('pg-password-util');
const sql = genAlterUserPasswordSql({
username: 'app',
password: 'my-new-secret-password',
passwordEncryption: 'scram-sha-256',
});Generate encoded password for use in a custom CREATE USER statement
import { encodeScramSha256 } = require('pg-password-util');
import * as pgFormat from 'pg-format';
const encodedPassword = encodeScramSha256({
password: 'my-new-secret-password',
iterations: 10000,
});
const sql = pgFormat('CREATE USER app PASSWORD %L LOGIN', encodedPassword);Change a user's password
import { alterUserPassword } = require('pg-password-util');
// client is a pg.Client
await alterUserPassword(client, {
username: 'app',
password: 'my-new-secret-password',
});Building and Testing
To build the module run:
$ makeTesting requires a PostgreSQL database. You can start one in the foreground via:
$ bin/postgres-serverThen, to run the tests run:
$ make testLicense
ISC. See the file LICENSE.

