Xavfsizlik2 min read

Shifrlash va hashing

Shifrlash - bu ma'lumotni kodlash jarayoni. Bu jarayon ma'lumotning asl ko'rinishi (ya'ni oddiy matn - plaintext) ni shifrlangan matn (ciphertext) deb ataladigan boshqa ko'rinishga

Shifrlash - bu ma'lumotni kodlash jarayoni. Bu jarayon ma'lumotning asl ko'rinishi (ya'ni oddiy matn - plaintext) ni shifrlangan matn (ciphertext) deb ataladigan boshqa ko'rinishga aylantiradi. Ideal holatda, faqat vakolatli tomonlar shifrlangan matnni yana plaintextga qaytarib, asl ma'lumotga kira olishi kerak. Shifrlashning o'zi aralashuvni oldini olmaydi, ammo ehtimoliy ushlab oluvchidan mazmunni tushunish imkonini olib qo'yadi. Shifrlash ikki yo'nalishli funksiya; shifrlangan ma'lumotni to'g'ri kalit bilan qayta yechish mumkin.

Hashing - bu berilgan kalitni boshqa qiymatga aylantirish jarayoni. Yangi qiymat matematik algoritm asosida hash funksiyasi orqali hosil qilinadi. Hashing bajarilgach, natijadan kirish qiymatiga qaytish imkonsiz bo'lishi kerak.

Shifrlash

Node.js crypto deb nomlangan ichki modulni taqdim etadi; u satrlar, sonlar, bufferlar, streamlar va boshqalarni shifrlash hamda yechishda ishlatiladi. Nest keraksiz abstraksiyalarni kiritmaslik uchun bu modul ustidan qo'shimcha paket taqdim etmaydi.

Masalan, AES (Advanced Encryption System) ning 'aes-256-ctr' algoritmi CTR shifrlash rejimidan foydalanamiz.

TypeScript
1import { createCipheriv, randomBytes, scrypt } from 'node:crypto';
2import { promisify } from 'node:util';
3
4const iv = randomBytes(16);
5const password = 'Password used to generate key';
6
7// The key length is dependent on the algorithm.
8// In this case for aes256, it is 32 bytes.
9const key = (await promisify(scrypt)(password, 'salt', 32)) as Buffer;
10const cipher = createCipheriv('aes-256-ctr', key, iv);
11
12const textToEncrypt = 'Nest';
13const encryptedText = Buffer.concat([
14  cipher.update(textToEncrypt),
15  cipher.final(),
16]);

Endi encryptedText qiymatini yechamiz:

TypeScript
1import { createDecipheriv } from 'node:crypto';
2
3const decipher = createDecipheriv('aes-256-ctr', key, iv);
4const decryptedText = Buffer.concat([
5  decipher.update(encryptedText),
6  decipher.final(),
7]);

Hashing

Hashing uchun bcrypt yoki argon2 paketlaridan foydalanishni tavsiya qilamiz. Nest keraksiz abstraksiyalar kiritmaslik uchun bu modullar ustidan qo'shimcha o'ramlar taqdim etmaydi (o'rganish egri chizig'ini qisqartirish uchun).

Masalan, tasodifiy parolni hash qilish uchun bcryptdan foydalanamiz.

Avval kerakli paketlarni o'rnating:

Terminal
1$ npm i bcrypt
2$ npm i -D @types/bcrypt

O'rnatish tugagach, hash funksiyasidan quyidagicha foydalanishingiz mumkin:

TypeScript
1import * as bcrypt from 'bcrypt';
2
3const saltOrRounds = 10;
4const password = 'random_password';
5const hash = await bcrypt.hash(password, saltOrRounds);

Salt yaratish uchun genSalt funksiyasidan foydalaning:

TypeScript
1const salt = await bcrypt.genSalt();

Parolni solishtirish/tekshirish uchun compare funksiyasidan foydalaning:

TypeScript
1const isMatch = await bcrypt.compare(password, hash);

Mavjud funksiyalar haqida batafsil bu yerda o'qing.