import argon2 from 'argon2'; import { config } from '@config/index.js'; export async function hashPassword(password: string): Promise { return argon2.hash(password, { type: argon2.argon2id, memoryCost: config.ARGON2_MEMORY, timeCost: config.ARGON2_ITERATIONS, parallelism: config.ARGON2_PARALLELISM, }); } export async function verifyPassword(hash: string, password: string): Promise { try { return await argon2.verify(hash, password); } catch { return false; } } export function validatePasswordStrength(password: string): { valid: boolean; errors: string[] } { const errors: string[] = []; if (password.length < 8) { errors.push('Password must be at least 8 characters'); } if (password.length > 16) { errors.push('Password must not exceed 16 characters'); } if (!/[A-Z]/.test(password)) { errors.push('Password must contain at least one uppercase letter'); } if (!/[a-z]/.test(password)) { errors.push('Password must contain at least one lowercase letter'); } if (!/[0-9]/.test(password)) { errors.push('Password must contain at least one number'); } if (!/[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(password)) { errors.push('Password must contain at least one special character'); } return { valid: errors.length === 0, errors }; }