scrypt — paroldan kalit hosil qilish va parol hashini saqlash uchun mo‘ljallangan memory-hard funksiya. Colin Percival uni 2009-yilda ishlab chiqqan. scrypt har bir parol taxmini uchun katta xotira va hisoblash talab qilib, GPU, FPGA yoki maxsus ASIC yordamida ommaviy brute-force hujumini iqtisodiy jihatdan qimmatlashtirishni ko‘zlaydi. Funksiya RFC 7914da tavsiflangan.
Asosiy tuzilishi
scrypt PBKDF2-HMAC-SHA-256dan kirish va yakuniy kengaytirish bosqichlarida foydalanadi, asosiy memory-hard ishni esa ROMix bajaradi. ROMix Salsa20/8 asosidagi BlockMix funksiyasi yordamida katta pseudorandom bloklar jadvalini xotirada hosil qiladi va keyin ma’lumotga bog‘liq indekslar bilan shu jadvalga qayta murojaat qiladi. Xotirani saqlamasdan hisoblash mumkin, lekin bu vaqtni keskin oshiradi.
Uchta asosiy parametr mavjud:
N— CPU va xotira xarajatining asosiy koeffitsiyenti, odatda ikkilik daraja;r— blok hajmi parametridir;p— parallelizatsiya koeffitsiyenti.
Taxminiy xotira talabi 128 × N × r byte atrofida. p hisoblash ishini oshiradi va implementatsiya parallel bajarishi mumkin. Parametr kombinatsiyasi overflow, juda katta allocation yoki xizmatni rad ettirishga olib kelmasligi uchun kutubxona chegaralari bilan tekshiriladi.
Parol yozuvi
Har parol uchun kriptografik tasodifiy salt yaratiladi. Hash yozuvi algoritm identifikatori, N, r, p, salt va derived keyni saqlaydi. Salt bir xil parollarni ajratadi, parametrlar esa keyinchalik tekshirish va rehash uchun kerak. Login paytida kiritilgan parol ayni parametrlar bilan qayta ishlanib, natija constant-time funksiya bilan solishtiriladi.
Parametrlar serverdagi real parallel login yuki ostida benchmark qilinadi. Bitta hash uchun 128 MB xotira qulay ko‘rinsa ham, yuzta parallel so‘rov 12,8 GBdan ko‘p xotira talab qilishi mumkin. Login navbati, rate limit va worker soni memory cost bilan birgalikda sozlanadi. Tashqi foydalanuvchi hash parametrlarini bevosita boshqara olmaydi.
Kalit hosil qilish
scrypt shifrlangan backup yoki wallet formatida paroldan encryption key olish uchun ishlatiladi. Salt va parametrlar ciphertext metadata’sida saqlanadi. Kalitdan AES-GCM yoki ChaCha20-Poly1305 kabi authenticated encryption sxemasi foydalanadi. AEAD tagi noto‘g‘ri parol yoki o‘zgartirilgan ciphertextni aniqlaydi.
Derived key bir necha mustaqil vazifaga kerak bo‘lsa, undan domain-separated subkeylar olinadi. Shifrlash va MAC uchun ayni byte’larni nazoratsiz qayta ishlatish protokolni zaiflashtirishi mumkin. Zamonaviy AEAD odatda alohida qo‘lda MAC kaliti boshqarish ehtiyojini kamaytiradi.
Argon2 bilan munosabati
Argon2 Password Hashing Competition natijasida yaratilgan va uning Argon2id varianti yangi password hashing tizimlarida keng tavsiya etiladi. Argon2 xotira, vaqt va parallelizmni aniq sozlaydi hamda zamonaviy kriptotahlilga ega. scrypt esa uzoq yillik implementatsiyalar va mavjud formatlarda barqaror qo‘llanadi. Migratsiya zarurati faqat algoritm nomiga emas, real parametrlar, kutubxona va tahdid modeliga bog‘liq.
scryptning juda past N qiymati uni memory-hard nomiga qaramay zaif qiladi. Kuchli parametr ham foydalanuvchining qisqa va keng tarqalgan parolini mutlaq himoya qilmaydi; u taxmin narxini oshiradi. MFA, rate limit va buzilgan parollarni tekshirish boshqa hujum yo‘llarini boshqaradi.
Formatlararo moslik
Kutubxonalar scrypt chiqishini turli satr formatida saqlashi mumkin. Parametr nomi bir xil bo‘lsa ham, Nning logarifmik yoki bevosita yozilishi, salt encodingi va derived key uzunligi farq qiladi. Migratsiyada test vektori bilan ayni byte natijasi tekshiriladi. Foydalanuvchining eski hashi muvaffaqiyatli verifikatsiyadan keyin yangi canonical formatga ko‘chiriladi; xom satrni taxmin bilan parse qilish account lockout keltirishi mumkin.
Bog‘liq tushunchalar
Password hashing, Memory-hard function, ROMix, PBKDF2, Argon2id, Salt, Key derivation function