Skip to Content
📚 Tutorial🗄️ DatabasePostgresql3) Extentions

Extentions

Used to backup whole databases / tables

Basic usage

Use \dx to check the current installed extentions

SQL Terminal
\dx users=# \dx List of installed extensions Name | Version | Schema | Description ----------+---------+------------+------------------------------ pgcrypto | 1.3 | public | cryptographic functions plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (2 rows)

pgcrypto

Let use pgcrypto as an examples

Create a databse for examples

SQL Terminal
# Create DB CREATE DATABASE enc_test; # Goto this DB \c enc_test # Enable pgcrypto for this DB CREATE EXTENSION IF NOT EXISTS pgcrypto; # Create Table for demo CREATE TABLE users_data ( users_id SERIAL PRIMARY KEY, username varchar(50), password text );

- pgp (Reversible Encrypt)

Used for data that need’s to be decrypt to original data.

Let’s use pgp_sym_encrypt to encrypt input data:

SQL Terminal
# Insert Dummy Data INSERT INTO users_data (username, password) VALUES ('peter', PGP_SYM_ENCRYPT('123', 'my_sEcRet_K0y')), ('may' , PGP_SYM_ENCRYPT('abc3od', 'my_sEcRet_K0y')); # View Table Select * FROM users_data; # Get decrypt Data with query SELECT username, pgp_sym_decrypt(password::bytea, 'my_sEcRet_K0y') as password FROM users_data;

For Drizzle Usage:

server.ts
import { db } from "../../db/db"; import { sql } from "drizzle-orm"; import { usersData } from "../../db/schema"; import { randomUUID } from "crypto"; export async function readUserByInfoSelect() { const userFound = await db.select( { username: usersData.username, password : sql`pgp_sym_decrypt(password::bytea, 'my_sEcRet_K0y')`.as('password') } ).from(usersData) return userFound; } export async function readUserByInfo() { const userFound = await db.query.usersData.findMany({ with: { password: false }, extras: { password : sql`pgp_sym_decrypt(password::bytea, 'my_sEcRet_K0y')`.as('password'), }, }); return userFound; } export async function insertUserByInfo() { await db.insert(usersData) .values({ "username": randomUUID(), "password": sql`PGP_SYM_ENCRYPT(${randomUUID()}, 'my_sEcRet_K0y')` }) }

- crypt (Un-Reversible Encrypt)

Using crypt() and gen_salt() to hash the password.

SQL Terminal
# Insert Dummy Data INSERT INTO users_data (username, password) VALUES ('peter', crypt('123', gen_salt('md5'))), ('may' , crypt('ab3e2', gen_salt('md5'))); # View Table Select * FROM users_data; ## Result users_id | username | password ----------+----------+------------------------------------ 10 | peter | $1$wjEW2rT1$lc8rjwRA32oZPYD1SpC0e/ 11 | may | $1$AxLdYCVA$efK.pxj7w4wL9KejqfRA..

Check PW with crypt().

SQL Terminal
# Check PW with crypt functions SELECT * FROM users_data WHERE username = 'peter' AND password = crypt('123', password);

References:
https://www.postgresql.org/docs/current/pgcrypto.html#PGCRYPTO-PASSWORD-HASHING-FUNCS-GEN-SALT 

Last updated on