38 lines
1.1 KiB
TypeScript
38 lines
1.1 KiB
TypeScript
|
|
import * as crypto from 'crypto';
|
||
|
|
|
||
|
|
const algorithm = 'aes-256-cbc';
|
||
|
|
const secretKey = crypto.scryptSync('your-secret-password', 'salt', 32);
|
||
|
|
const ivLength = 16;
|
||
|
|
|
||
|
|
// Encrypt function
|
||
|
|
export function encryptUserId(id: string): string {
|
||
|
|
const iv = crypto.randomBytes(ivLength);
|
||
|
|
const cipher = crypto.createCipheriv(algorithm, secretKey, iv);
|
||
|
|
let encrypted = cipher.update(id, 'utf8', 'hex');
|
||
|
|
encrypted += cipher.final('hex');
|
||
|
|
return `${iv.toString('hex')}:${encrypted}`;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Decrypt function
|
||
|
|
export function decryptUserId(encryptedId: string): string | null {
|
||
|
|
try {
|
||
|
|
const parts = encryptedId.split(':');
|
||
|
|
if (parts.length !== 2) {
|
||
|
|
console.error('Invalid encryptedId format:', encryptedId);
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
const iv = Buffer.from(parts[0], 'hex');
|
||
|
|
const encryptedText = Buffer.from(parts[1], 'hex');
|
||
|
|
|
||
|
|
const decipher = crypto.createDecipheriv(algorithm, secretKey, iv);
|
||
|
|
let decrypted = decipher.update(encryptedText);
|
||
|
|
decrypted = Buffer.concat([decrypted, decipher.final()]);
|
||
|
|
|
||
|
|
return decrypted.toString('utf8');
|
||
|
|
} catch (error) {
|
||
|
|
console.error('Decryption failed:', error);
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
}
|