ideal parolni hashing algoritmi qanday ko'rinishga ega bo'ladi?

Ogohlantirishlar: SOda shunga o'xshash ko'plab savollar bor, lekin men faqat umumiy printsiplar o'rniga amaliy taklifni qidiraman. Shuningdek, "ideal" algoritmni (PHP yaxshi bo'lardi) amalga oshirishga e'tibor bering, biroq iltimos, ma'lumotni taqdim eting (qanday ishlaydi).

Ma'lumotlar bazasida saqlash uchun parolning xash satrini hisoblashning eng yaxshi yo'li nima? Men bilaman:

  • tuzdan foydalaning
  • hashing jarayonini bir necha marta yineleme ( kalit uzunligi uchun hash chizig'i)

Bunday algoritmni ishlatishni o'ylardim:

x = md5( salt + password);
repeat N-times:
    x = md5( salt + password + x );

Ishonchim komilki, bu juda xavfsiz, biroq bir nechta savollar bor:

  1. foydalanuvchi ismini tuzga kiritish foydali bo'larmidi?

  2. Barcha foydalanuvchilar uchun umumiy tuzni ishlatishga qaror qildim. Buning hech qanday salbiy tomoni yo'qmi?

  3. Tavsiya etilgan eng kam tuz uzunligi nima?

  4. md5, sha yoki boshqa biror narsani ishlatishim kerakmi?

  5. Yuqorida ko'rsatilgan algoritm bilan biron-bir narsa noto'g'ri.

  6. ... (qo'shimcha ma'lumot berishni istamang)

Men qarorlarni majburiy ravishda vaziyatga bog'liq deb bilaman, lekin men quyidagi echimni izlayapman:

  • provide as much security as possible
  • be fast enough ( < 0.5 second on a decent machine )

Xo'sh, ideal algoritm nimani anglatadi, prezentatsiya kodida?

2
qo'shib qo'ydi muallif johndodo, manba
Nega qayta-qayta aralashish kerak?
qo'shib qo'ydi muallif GazTheDestroyer, manba

2 javoblar

"Ideal" parolni hashing funksiyasi hozirda bcrypt . Tuzni qayta ishlash va sozlashning ko'p sonli iteratsiyalari mavjud. bepul opensource PHP dasturi mavjud.

Ikkinchidan, eng yaxshi xash funktsiyasiga tayanadigan va sizga o'xshash narsalarga o'xshash bo'lgan PBKDF2 bo'ladi. tavsiya qilamiz. texnik sabablar mavjud. nima uchun bkrypt PBKDF2 ga qaraganda "yaxshiroq".


Sizning aniq savollaringizga kelsak:

1. foydalanuvchi ismini tuzga kiritish foydali bo'larmidi?

Uncha emas.

2.

Barcha foydalanuvchilar uchun umumiy tuzni foydalanishga qaror qildim

Ha, tuzga ega bo'lishning foydalari yo'qoladi. Tuzning yagona sababi - har bir parol uchun yagona bo'lishi kerak. Bu buzg'unchiga ikkita parol paroliga hujum qilishni oldini oladi, bu esa ikki barobar ko'proq parolni kiritganidan ko'ra kamroq kuchga ega. Tuzlar noyob bo'lishi kerak. Hatto foydalanuvchi uchun tuz bo'lganligi ham yomon: foydalanuvchi parolni o'zgartirganda tuzni ham o'zgartirish kerak. Tuzni qayta ishlatish/ulashish vaqtida tajovuzkorni qo'llashi mumkin bo'lgan optimallashtirish turi o'z ichiga (faqat shular bilan cheklanmagan), prekompyuterli xeshlar jadvali (masalan, kamalagi jadvallari .

3. agar tuzilgan bo'lsa, eng kam tuz uzunligi nima?

Tuz yagona bo'lishi kerak. O'zgarmaganlik - qo'riqlash uchun qiyin masala. Biroq, etarlicha etarlicha tasodifiy tuzlarni (yaxshi tasodifiy sonlar generatori bilan hosil qilingan, tercihen kriptografik jihatdan kuchli) yaratib, etarlicha yuqori ehtimollik bilan yagona xususiyatga ega bo'lasiz. 128-bit tuzlar etarli.

4. md5, sha yoki boshqa biror narsa ishlatishim kerakmi?

MD5 jamoatchilik bilan aloqalar uchun yomondir. Bu ma'lum bir foydalanish uchun qo'llanilishi mumkin yoki bo'lmasligi mumkin bo'lgan zaif tomonlarni biladi va bu zaif tomonlar muayyan vaziyatga taalluqli bo'lmagan har qanday ishonchliligi bilan "isbotlash" juda qiyin. SHA-1 yaxshiroq, lekin "yaxshi" emas, chunki MD5-dan ko'ra kamroq jiddiy bo'lsa-da, ularda ham zaifliklar bor. SHA-256 - bu oqilona tanlovdir. Yuqorida qayd etilganidek, parolni hashlash uchun siz emas funksiyasini parallel arxitekturaga mos ravishda o'zgartirishni xohlaysiz GPU va SHA-256 tarozi yaxshi, shuning uchun bcryptda ishlatiladigan Blowfish-lotin afzallik beriladi.

5. yuqorida keltirilgan algoritm bilan biron-bir taklif yo'qmi?

Bu uy quriladi. Bu yomon. Muammo shundaki, kriptografik algoritmning xavfsizligi uchun ma'lum bir sinov yo'q. Biz umid qilishimiz mumkin bo'lgan eng yaxshi narsa - bir necha yuzlab professional kriptografi algoritmini bir necha yillar davomida sindirishga imkon berishdir, agar imkoni bo'lmasa, unda algoritmni "ishonchli" deb hisoblash mumkin bo'lsa-da, hech bo'lmasa zaif tomonlar aniq bo'lmasligi kerak. Brixry atrofida tarqaldi, keng tarqaldi va 12 yil tahlil qilindi. StackOverflow yordami bilan o'zingiz ham buni o'zingiz qilolmaysiz.

Men professional kriptografi sifatida men MD5 yoki hatto SHA-256da oddiy bitimni ishlatishda shubhali qoshni ko'targan bo'lar edim: bular Merkle-Damgård hash funktsiyalari, bu to'qnashuv qarshiligi uchun yaxshi, lekin tasodifiy Oracle (" uzatma kengaytmasi "deb ataladigan) mavjud bo'lgan savollarga/879/nima-is-random-oracle-model-and-why-is-it-disputed . PBKDF2 da, xash funktsiyasi bevosita foydalanilmaydi, lekin HMAC orqali.

6
qo'shib qo'ydi
Rahmat, men buni umid qilganim - men brixdan xabari yo'qligini tan olishim kerak. Endi bu haqda ma'lumot olish uchun tarmoqni qidirib topdim ... nima uchun buni bilaman ... Bu eng yaxshi saqlanadigan sirlardan biri bo'lishi kerak ...;) Sizning postingga roziman, siz ko'targan xavotirlarim meni aniqlagan savol. Bcrypt'dan to'g'ri foydalanish bo'yicha qanday takliflar mavjud? phpass yoki ba'zi boshqa class ?
qo'shib qo'ydi muallif johndodo, manba
Bu javob phpass taklif qiladi va o'xshab ko'rinadi undan qanday foydalanish haqida tafsilotlar. Men PHP-da o'zimni rivojlantirmayman.
qo'shib qo'ydi muallif Thomas Pornin, manba

Men qattiq dastur tuzi, foydalanuvchi nomi va paroldan foydalanmoqdaman

Misol ...

string prehash = "mysaltvalue" + "myusername" + "mypassword";

Buning foydasi shuki, foydalanuvchi bir xil parolni ishlatish bir xil xash qiymati bilan yakunlanmaydi va odamlar bazasiga boshqa foydalanuvchilarga parollarni nusxalashga yo'l qo'ymaydi - agar siz JBga kirish imkoni bo'lmasa, albatta ma'lumotlarni olish uchun kirishni o'chirishga to'g'ri keladi;)

IMO, tuz uzunligi juda katta ahamiyatga ega emas, zichlangan qiymat uzunligi har doim ham 32 bo'ladi (MD5 dan foydalanadigan - yana men foydalanadigan narsa)

Xavfsizlik nuqtai nazaridan aytishim mumkinki, bu parolni shifrlash yetarli, eng muhimi, sizning ilovangiz/ma'lumotlar bazasida xavfsizlik buzilmasligiga ishonch hosil qilish!

Bundan tashqari, men qayta-qayta aralashish bilan bezovta qilmayman, menimcha, hech qanday nuqta. Agar kimdir sizni bu usulni buzishga urinish uchun sizni algoritm bilishi kerak edi va agar bilsalar, buni bilsalar, ular bir yoki bir necha marotaba aralashtirilganmi, ahamiyatsiz emas

1
qo'shib qo'ydi
Hashingning ko'plab turlari hisobni oshiradi. Bu bir martalik autentifikatsiya qilish uchun arzon, biroq tezda buzg'unchilar uchun qimmatroq bo'ladi.
qo'shib qo'ydi muallif Roger Lipscombe, manba
To'liq. :) @musefan: "Yaxshi etarlicha yaxshi" o'rniga "eng yaxshi amaliyot" yechimini izlayapman. Harakatlarda hech qanday zarar yo'q - u erdagi juda kam xavfsizlik echimlari mavjud (ular sizning so'zingiz emas). Tuz satr uzunligi muhim ahamiyatga ega, chunki u kengaygan kamarni uzaytiradi - katta gumbaz jadvallarini talab qiladi (o'ylayman). Men boshqa teshiklarni ham qabul qilaman, lekin bu butunlay yangi mavzu. :)
qo'shib qo'ydi muallif johndodo, manba
@RogerLipscombe: Ha, yaxshi nuqta.
qo'shib qo'ydi muallif musefan, manba
@ johndodo: Agar ular tuz kalitini bilsalar, unda uzunligi muhim emas, agar ular kamalak jadvallarini ishlatsa, unda ular to'g'ridan-to'g'ri xashni yoki sizning kirish funksiyangizni buzishadi (bu holatda ular tuz haqida g'amxo'rlik qilishning hojati yo'q) )
qo'shib qo'ydi muallif musefan, manba