Asosiy kontentga o‘tish
Innovialabs

Parollarni qanday to‘g‘ri saqlash kerak: bcrypt, scrypt va Argon2

Amaliyot3 daq

Qisqacha

Parollar faqat salt qo‘shilgan sekin xesh ko‘rinishida saqlanadi — Argon2id, scrypt yoki bcrypt, MD5 yoki SHA emas. Eski xeshlar yangi algoritmga asta-sekin, foydalanuvchi tizimga kirganda o‘tkaziladi.

Qisqa javob

Parol hech qachon ochiq holda saqlanmaydi va shifrlanmaydi ham. U parollar uchun maxsus xesh funksiyasidan — Argon2id, scrypt yoki bcrypt orqali o‘tkaziladi va natija saqlanadi. Kirishda parol qayta xeshlanadi va solishtiriladi.

Yangi loyiha uchun Argon2id ni tanlang. Agar stekingizda u yaxshi qo‘llab-quvvatlanmasa, scrypt yoki bcrypt ham mos keladi. MD5, SHA-1 va hatto oddiy SHA-256 parollar uchun yaramaydi.

Nega MD5 va SHA ishlamaydi

MD5 va SHA ma’lumotlar yaxlitligini tekshirish uchun yaratilgan, ularning asosiy xususiyati — tezlik. Parollar uchun bu kamchilik: baza sizib chiqsa, hujumchi videokartalarda variantlarni juda katta tezlikda tekshiradi.

Oddiy xesh bilan nima noto‘g‘ri ketadi:

  • Bir xil parollar bir xil xesh beradi. Kimda parol bir xilligi ko‘rinadi, bitta topilgan parol hammasini ochadi.
  • Rainbow jadvallar. Ommabop parollarning xeshlari oldindan hisoblab qo‘yilgan, topish jadvaldan qidirishga aylanadi.
  • Tez tanlash. Lug‘atlar va o‘zgartirish qoidalari («Password1!», «qwerty2024») bir necha daqiqada tekshiriladi.

Ikki marta xeshlash (md5(sha1(p))) yoki koddagi «maxfiy» salt muammoni hal qilmaydi — tezlik o‘zgarmaydi.

Salt va work factor nima qiladi

Salt — har bir parol uchun noyob tasodifiy qator. U xesh yonida saqlanadi va sir hisoblanmaydi. Salt bir xil parollarning xeshlarini har xil qiladi va rainbow jadvallarni foydasiz qiladi.

Work factor (narx) — xeshni hisoblashni ataylab sekinlashtiruvchi parametr. Foydalanuvchi farqni sezmaydi, hujumchi uchun esa har bir urinish qimmatga tushadi.

Zamonaviy kutubxonalar saltni o‘zi yaratadi va parametrlar bilan birga xesh qatoriga yozadi, masalan $argon2id$v=19$m=19456,t=2,p=1$.... Salt uchun alohida ustun kerak emas.

Algoritmlarni solishtirish

AlgoritmNima sozlanadiXususiyatlari
Argon2idxotira, iteratsiyalar, parallellikXotira sarfi hisobiga GPU’da tanlashga chidamli. Standart tanlov
scryptN (xotira va vaqt), r, pU ham ko‘p xotira talab qiladi, keng qo‘llab-quvvatlanadi
bcryptcost (raundlar sonining logarifmi)Vaqt sinovidan o‘tgan, deyarli hamma joyda bor. Parolning faqat dastlabki 72 baytini hisobga oladi
PBKDF2iteratsiyalar soniFIPS talablariga moslik kerak bo‘lsa. Faqat CPU’ni yuklaydi

Parametrlarni qanday tanlash

  1. OWASP Password Storage Cheat Sheet tavsiyalaridan boshlang — u yerda har bir algoritm uchun dolzarb minimal qiymatlar berilgan.
  2. Xeshlash vaqtini o‘zingizning production serveringizda o‘lchang. Mo‘ljal — bitta amal uchun soniyaning bir qismi: kirish tez bo‘lsin, server esa eng yuqori yuklamaga bardosh bersin.
  3. Xotirani hisobga oling: katta xotira parametrli Argon2 bir vaqtda ko‘p kirishlar bo‘lganda RAM’ni tugatishi mumkin.
  4. Server almashganda parametrlarni qayta ko‘rib chiqing va vaqt o‘tishi bilan oshirib boring.

argon2-cffi kutubxonasi bilan Python misoli:

from argon2 import PasswordHasher
from argon2.exceptions import VerifyMismatchError

ph = PasswordHasher()  # xavfsiz standart parametrlar

stored = ph.hash("user-password")

try:
    ph.verify(stored, "user-password")
    if ph.check_needs_rehash(stored):
        stored = ph.hash("user-password")  # parametrlar eskirgan, qayta saqlaymiz
except VerifyMismatchError:
    pass  # parol noto‘g‘ri

Node.js’da bcrypt bilan: await bcrypt.hash(password, 12) va await bcrypt.compare(password, hash). PHP’da — password_hash(), password_verify() va password_needs_rehash().

Eski xeshlarni kirishda ko‘chirish

Foydalanuvchilarning parollarini siz bilmaysiz, shuning uchun butun bazani birdaniga qayta hisoblab bo‘lmaydi. Ishlaydigan sxema:

  1. Xesh algoritmi uchun maydon qo‘shing (yoki uni qator prefiksidan aniqlang).
  2. Kirishda parolni eski usulda tekshiring.
  3. Parol to‘g‘ri bo‘lsa — darhol Argon2id xeshini hisoblang va yozuvni almashtiring.
  4. Uzoq vaqt kirmaydigan foydalanuvchilarni darhol himoyalash mumkin: eski xeshni yangisiga o‘rang (argon2(md5(password))), keyingi kirishda esa sof Argon2id bilan almashtiring.
  5. Ma’lum muddatdan keyin qolgan eski xeshlarni o‘chiring va bunday foydalanuvchilardan parolni tiklashni so‘rang.

Ko‘p uchraydigan xatolar

  • Xeshlarni kutubxona funksiyasi o‘rniga oddiy == bilan solishtirish (vaqt bo‘yicha hujum ehtimoli).
  • «Sekin ishlayapti» deb cost’ni juda past qo‘yish — yaxshisi kirish urinishlari chastotasini cheklang.
  • Parollarni so‘rovlar va xatolar logiga yozish.
  • Parolni qisqartirish yoki uzun parollar va maxsus belgilarni taqiqlash.
  • Rate limiting va 2FA yo‘qligi — eng yaxshi xesh ham kirish formasi orqali tanlashdan qutqarmaydi.

Ko‘p beriladigan savollar

Yo‘q. Shifrlash qaytariladigan jarayon: kalit baza bilan birga o‘g‘irlansa, barcha parollar ochiladi. Xesh qaytarilmaydi va parolni tekshirish uchun asl qiymat kerak emas.

Bunda yordam beramiz

O‘zingiz shug‘ullanmasdan natija olishni istasangiz — biz har kuni shu bilan shug‘ullanamiz.

Loyihani muhokama qilish

Yana o‘qing

G‘oya yoki vazifangiz bormi? Bizga aytib bering

Ish kuni davomida javob beramiz va yechim taklif qilamiz. Konsultatsiya bepul.