pg-password-util
TypeScript icon, indicating that this package has built-in type declarations

1.0.0 • Public • Published

pg-password-util

NPM

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-util

Dependencies

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:

$ make

Testing requires a PostgreSQL database. You can start one in the foreground via:

$ bin/postgres-server

Then, to run the tests run:

$ make test

License

ISC. See the file LICENSE.

Package Sidebar

Install

npm i pg-password-util

Weekly Downloads

107

Version

1.0.0

License

ISC

Unpacked Size

14 kB

Total Files

6

Last publish

Collaborators

  • sehrope