UNPKG

captcha-canvas

Version:

A captcha generator by using skia-canvas module.

42 lines (41 loc) 1.45 kB
"use strict"; /** * Security utilities for CAPTCHA generation */ Object.defineProperty(exports, "__esModule", { value: true }); exports.constantTimeDelay = constantTimeDelay; exports.generateSessionToken = generateSessionToken; exports.hashSolution = hashSolution; exports.verifySolution = verifySolution; /** * Adds consistent timing to prevent timing attacks */ async function constantTimeDelay(minMs = 100, maxMs = 300) { const delay = Math.random() * (maxMs - minMs) + minMs; return new Promise(resolve => setTimeout(resolve, delay)); } /** * Generates a secure session token for CAPTCHA verification */ function generateSessionToken() { const { randomBytes } = require('crypto'); return randomBytes(32).toString('hex'); } /** * Creates a hash of the CAPTCHA solution for secure storage */ function hashSolution(solution, salt) { const crypto = require('crypto'); const actualSalt = salt || randomBytes(16).toString('hex'); const hash = crypto.pbkdf2Sync(solution.toUpperCase(), actualSalt, 10000, 64, 'sha512'); return `${actualSalt}:${hash.toString('hex')}`; } /** * Verifies a CAPTCHA solution against its hash */ function verifySolution(solution, hashedSolution) { const crypto = require('crypto'); const [salt, hash] = hashedSolution.split(':'); const verifyHash = crypto.pbkdf2Sync(solution.toUpperCase(), salt, 10000, 64, 'sha512'); return hash === verifyHash.toString('hex'); }