PHP da shifrlash. PHP shifrlash va autentifikatsiya kalitlaridagi kalit yordamida maʼlumotlarni shifrlash, shifrini ochish

  • Tarjima
  • Oʻquv qoʻllanma

Tarjimondan: dasturlash jarayonida men kriptografiyada xavfli darajada qobiliyatsiz ekanligimni hech qachon unutmayman va men hammaga ushbu tezisni davom ettirishni maslahat beraman (ehtimol, siz va u yerdagi ajoyib yigitdan tashqari). Biroq, u yoki bu tarzda, ish jarayonida ma'lumotlarni himoya qilish bilan bog'liq muammolar paydo bo'ladi va ularni hal qilish kerak. Shuning uchun men sizning e'tiboringizga Finlyandiya ishlab chiqaruvchisi Timo Hning maqolasi tarjimasini taqdim etaman, u men uchun juda qiziqarli va foydalidir.

Bu PHP-da simmetrik shifrlash bilan keng tarqalgan tuzoqlardan qanday qochish bo'yicha tezkor qo'llanma.

Biz ma'lumotlar server tomonida ishlov berilganda (xususan, shifrlash serverda sodir bo'ladi va ma'lumotlar, masalan, mijozdan aniq matn, parol va boshqalar ko'rinishida olinishi mumkin) ishni ko'rib chiqamiz. Bu PHP ilovalari uchun odatiy holdir.

Ushbu qo'llanmadagi ma'lumotlardan murakkabroq talablarga ega shifrlangan tarmoq ulanishlarini yaratish uchun foydalanilmasligi kerak. Bunday holatlar uchun siz josuslik yoki TLS dan foydalanishingiz kerak.

Tabiiyki, bu erda berilgan tavsiyalar PHP-da shifrlashni tashkil qilishning "yagona mumkin bo'lgan usuli" emas. Ushbu qo'llanmaning maqsadi xatolar va qiyin, noaniq qarorlar uchun kamroq joy qoldirishga harakat qilishdir.

PHP da shifrlash funksiyalari

Mcrypt yoki OpenSSL kengaytmalaridan foydalaning.

Shifrlash algoritmi va uning ishlash tartibi, bir martalik kod (boshlash vektori)

Tasodifiy bir martalik kod bilan CTR rejimida AES-256 dan foydalaning ( taxminan. tarjimasi: nonce). AES standartdir, shuning uchun siz Mcrypt yoki OpenSSL kengaytmalarining funksiyalaridan foydalanishingiz mumkin.

Har doim yangi bir martalik kod yarating. Bunday holda, siz tasodifiy raqamlarning kriptografik xavfsiz manbasidan foydalanishingiz kerak. Quyida tasodifiy sonlarni yaratish haqida bir oz ko'proq o'qing. Bir martalik kod sir emas, uni uzatish va keyingi shifrlash uchun shifrlangan matn bilan birlashtirish mumkin.

Bir martalik kod uzunligi 128 bit (16 bayt) bo'lishi kerak, faqat kodlashsiz baytlar qatori.

Mcrypt kengaytmasida AES Rijndael-128 ( taxminan. tarjima: biz AES-256 haqida gapirayotganimizga qaramay, bu xato emas. AES-256!= Rijndael-256). OpenSSL-da, mos ravishda, AES-256-CTR.

Mcrypt foydalanish misoli:
OpenSSL misoli:
Sinov vektorlari yordamida shifrlash to'g'ri ishlayotganligini tekshiring ( taxminan. tarjima: AES-256-CTR uchun 57-betdagi F.5.5 bandiga qarang).

CTR rejimi uchun shifrlangan ma'lumotlarning umumiy hajmida ba'zi cheklovlar mavjud. Siz buni amalda uchratmasligingiz mumkin, lekin shuni yodda tutingki, bitta uzun yoki ko'p qisqa xabar bo'lishidan qat'i nazar, bitta kalit bilan 2^64 baytdan ortiq ma'lumotlarni shifrlamaslik kerak.

Agar siz bir xil kalit bilan bir martalik kodni ishlatmasangiz, CTR rejimi barqaror bo'lib qoladi. Shu sababli, kriptografik jihatdan kuchli tasodifiy manbadan foydalangan holda bir martalik kodlarni yaratish muhimdir. Bundan tashqari, bu bitta kalit bilan 2^64 dan ortiq xabarni shifrlamaslik kerakligini anglatadi. Bir martalik kodning uzunligi 128 bit bo'lganligi sababli, xabarlar sonining chegarasi (va ularning bir martalik kodlari) 2^128/2 tug'ilgan kun paradoksi ( taxminan. tarjima:).

Shuni yodda tutingki, shifrlash siz qancha ma'lumot yuborayotganingizni yashirmaydi. Ekstremal holatga misol sifatida, agar siz faqat "ha" yoki "yo'q" bo'lgan xabarlarni shifrlasangiz, shifrlash bu ma'lumotni yashirmasligi aniq.

Ma'lumotlarni autentifikatsiya qilish

Har doim ma'lumotlarning haqiqiyligi va yaxlitligini tekshiring.
Buning uchun shifrlashdan keyin MAC dan foydalaning. Bular. Avval ma'lumotlar shifrlanadi, so'ngra hosil bo'lgan shifrlangan matndan, shu jumladan shifrlangan matnning o'zi va bir martalik koddan HMAC-SHA-256 olinadi.

Shifrni ochishda avval HMAC ni vaqtni belgilash hujumlariga chidamli taqqoslash algoritmi yordamida tekshiring. $user_submitted_mac va $calculated_mac ni == yoki === taqqoslash operatorlari yordamida to'g'ridan-to'g'ri solishtirmang. "HMAC double check" dan foydalanish yaxshiroq.

Agar HMAC tekshiruvi muvaffaqiyatli bo'lsa, shifrni hal qilish xavfsiz tarzda amalga oshirilishi mumkin. Agar HMAC mos kelmasa, darhol o'chiring.

Shifrlash va autentifikatsiya kalitlari

Ideal holda, kriptografik jihatdan kuchli tasodifiy manbadan olingan kalitlardan foydalaning. AES-256 32 bayt tasodifiy ma'lumotni talab qiladi ("xom" qator - hech qanday kodlashdan foydalanmasdan bitlar ketma-ketligi).

Agar ilova PBKDF2 ning oʻrnatilgan ilovasiga ega boʻlmagan 5.5 dan past boʻlgan PHP versiyasi ostida ishlayotgan boʻlsa, siz PHP-da oʻzingizning ilovangizdan foydalanishingiz kerak boʻladi, bunga misolni bu yerda topishingiz mumkin: https://defuse. ca/php-pbkdf2.htm. Shuni yodda tutingki, o'zingizning dasturingizga tayansangiz, o'rnatilgan hash_pbkdf2() funktsiyasi kabi kalitni to'g'ri hal qilmasligi mumkin.

Shifrlash va autentifikatsiya qilish uchun bir xil kalitdan foydalanmang. Yuqorida aytib o'tilganidek, shifrlash kaliti uchun 32 bayt va autentifikatsiya kaliti (HMAC) uchun 32 bayt talab qilinadi. PBKDF2 yordamida siz paroldan 64 baytni olishingiz va aytaylik, birinchi 32 baytni shifrlash kaliti sifatida, qolgan 32 baytni autentifikatsiya kaliti uchun ishlatishingiz mumkin.

Agar parollaringiz faylda, masalan, HEX qatori sifatida saqlangan bo'lsa, ularni shifrlash funksiyalariga yuborishdan oldin ularni qayta kodlamang. Buning o'rniga, HEX-kodlangan kalitlarni to'g'ridan-to'g'ri yuqori sifatli shifrlash yoki autentifikatsiya kalitiga aylantirish uchun PBKDF2 dan foydalaning. Yoki parollarni xeshlash uchun SHA-256 dan qo'shimcha kodlashsiz (faqat 32 baytlik qator) foydalaning. Muntazam parolni xeshlashdan foydalanish etarli entropiyani ta'minlaydi. Batafsil ma'lumot keyingi paragraflarda keltirilgan.

Kalit cho'zilishi

Birinchidan, siz past entropiya kalitlarini ishlatishdan qochishingiz kerak. Ammo shunga qaramay, agar siz, masalan, foydalanuvchi parollaridan foydalanishingiz kerak bo'lsa, kalit xavfsizligini maksimal darajada oshirish uchun PBKDF2-dan ko'p takrorlash bilan albatta foydalanishingiz kerak.

PBKDF2 parametrlaridan biri bu xeshli iteratsiyalar soni. Va u qanchalik baland bo'lsa, siz ishonishingiz mumkin bo'lgan kalitning xavfsizligi shunchalik yuqori bo'ladi. Agar sizning kodingiz 64 bitli platformada ishlayotgan bo'lsa, PBKDF2 uchun xeshlash algoritmi sifatida SHA-512 dan foydalaning. 32-bitli platforma uchun SHA-256 dan foydalaning.

Biroq, DoS hujumi xavfi tufayli onlayn ilovalarda nisbatan ko'p takrorlashdan foydalanish mumkin emas. Shu sababli, kalit sifati oflayn ilovalardagi kabi yuqori bo'lmaydi, bu esa bunday xavf-xatarsiz ko'p sonli iteratsiyalarni ta'minlay oladi. Qoidaga ko'ra, onlayn ilovalar uchun PBKDF2 100 ms dan ko'p bo'lmagan vaqtni olishi uchun bunday miqdordagi xeshlash iteratsiyasi tanlanadi.

Agar siz yuqori entropiyali parollardan foydalanishingiz mumkin bo'lsa, uni past entropiya parollari uchun bo'lgani kabi uzaytirish shart emas. Misol uchun, agar siz /dev/urandom yordamida "encryption_master_key" va "auth_master_key" ni yaratsangiz, PBKDF2 ga umuman ehtiyoj qolmaydi. Faqat kalitlarni hech qanday kodlashsiz bitlar ketma-ketligi sifatida ishlatganingizga ishonch hosil qiling.

Bundan tashqari, PBKDF2 bilan bitta asosiy paroldan shifrlash va autentifikatsiya kalitlarini olish qiyin emas (faqat oz sonli iteratsiyalardan yoki hatto bittadan foydalaning). Bu shifrlash va autentifikatsiya uchun faqat bitta "bosh parol"ingiz bo'lsa foydali bo'ladi.

Kalitlarni saqlash va boshqarish

Eng yaxshi narsa alohida ajratilgan kalit saqlash qurilmasidan (HSM) foydalanishdir.

Agar buning iloji bo'lmasa, hujumni murakkablashtirish uchun alohida joyda (uy katalogi yoki sayt ildizidan tashqarida) saqlangan kalit yordamida kalit fayli yoki konfiguratsiya faylini (haqiqiy shifrlash/autentifikatsiya kalitlarini saqlaydi) shifrlashdan foydalanish mumkin. . Masalan, haqiqiy kalitlar faylining shifrini ochish uchun zarur bo'lgan kalitni saqlash uchun httpd.conf da Apache muhit o'zgaruvchisidan foydalanishingiz mumkin:
SetEnv keyfile_key crypto_strong_high_entropy_key # Siz ushbu o‘zgaruvchiga PHP da $_SERVER["keyfile_key"] yordamida kirishingiz mumkin # Konfiguratsiyaning qolgan qismi
Endi, agar sayt ildizi va undan pastdagi fayllar, shu jumladan kalitlari bo'lgan fayllar buzilgan bo'lsa (masalan, zaxira nusxasi sizib ketgan bo'lsa), shifrlangan ma'lumotlar xavfsiz bo'lib qoladi, chunki muhit o'zgaruvchisida saqlangan kalit buzilmagan. Shuni esda tutish kerakki, httpd.conf fayllari alohida zaxiralanishi kerak va keyfile_key o'zgaruvchisini, masalan, phpinfo() chiqishi orqali buzmaslik kerak.

Agar konfiguratsiya parametri o'rniga fayldan foydalansangiz, kalit aylanishini tashkil qilish mumkin. Eng yomon holatda, agar raqib sizning shifrlash va autentifikatsiya kalitlaringizni sezmasdan qo'lga kiritgan bo'lsa, kalitlarni ma'lum vaqt oralig'ida aylantirish ularning kirishini cheklashi mumkin (agar ular yangi kalitlarni ololmasa). Ushbu usul zararni kamaytirishga yordam beradi, chunki dushman buzilgan kalitlardan cheksiz foydalana olmaydi.

Ma'lumotlarni siqish

Umuman olganda, dastlabki matnni shifrlashdan oldin uni siqmaslik kerak. Bu dushmanga tahlil qilish uchun qo'shimcha vosita berishi mumkin.

Misol uchun, agar siz seans ma'lumotlarini shifrlangan cookie-fayllarda saqlasangiz, ularning ba'zilari foydalanuvchi tomonidan taqdim etiladi va ba'zilari maxfiy ma'lumotlarni ifodalaydi, dushman oddiy foydalanuvchi sifatida ba'zi maxsus tayyorlangan ma'lumotlarni yuborish orqali sir haqida qo'shimcha ma'lumotlarni bilib olishi mumkin. olingan shifrlangan matnlarning uzunligi qanday o'zgarishini o'lchash.

Agar takrorlanadigan joylar mavjud bo'lsa, matn samaraliroq siqiladi. Foydalanuvchi ma'lumotlarini manipulyatsiya qilish orqali siz uni qisman maxfiy ma'lumotlarga mos keladigan tarzda tanlashingiz mumkin. O'yin qanchalik katta bo'lsa, chiqishda shifrlangan matn shunchalik kichik bo'ladi. Ushbu turdagi hujum JINOYAT deb ataladi.

Agar sizda ma'lumotlarni siqish qiyin bo'lmasa, uni siqmang.

Server muhiti

Umumiy qoida sifatida, siz umumiy serverda xavfsizlikka sezgir ilovalarni joylashtirmasligingiz kerak. Misol uchun, umumiy hostingda, bu erda raqib siz bilan bir xil jismoniy serverdagi virtual mashinaga kirishi mumkin.

Umumiy serverlarni xavfsizlik uchun muhim ilovalarni joylashtirish uchun shubhali joyga aylantiradigan turli sabablar mavjud. Misol uchun, yaqinda virtual serverlar o'rtasidagi hujumlar ko'rsatildi: eprint.iacr.org/2014/248.pdf. Bu hujum usullari yomonlashmasligini, aksincha, vaqt o'tishi bilan sayqallanishi va takomillashtirilishini yaxshi eslatib turadi. Bunday tuzoqlarni har doim hisobga olish kerak.

Ekspert maslahati

Va nihoyat, xavfsizlik kodingizni tekshirish uchun mutaxassis bilan maslahatlashing.

(PHP 4, PHP 5, PHP 7)

crypt - bir tomonlama string xeshlash

Ogohlantirish

Bu funksiya (hali) ikkilik xavfsiz emas!

Tavsif

kript (string $str [, string $tuz]): string

crypt() standart Unix DES-ga asoslangan algoritm yoki tizimda mavjud bo'lishi mumkin bo'lgan muqobil algoritmlar yordamida xeshlangan satrni qaytaradi.

Tuz parametri ixtiyoriy. Biroq, crypt() tuzsiz zaif hash hosil qiladi. PHP 5.6 yoki undan keyingi versiyalarsiz E_NOTICE xatosini keltirib chiqaradi. Yaxshiroq xavfsizlik uchun etarlicha kuchli tuzni ko'rsatganingizga ishonch hosil qiling.

password_hash() kuchli xeshni ishlatadi, kuchli tuz hosil qiladi va avtomatik ravishda tegishli turlarni qo'llaydi. password_hash() oddiy hisoblanadi crypt() o'rash va mavjud parol xeshlari bilan mos keladi. dan foydalanish password_hash() rag'batlantiriladi.

Ba'zi operatsion tizimlar bir nechta turdagi xeshni qo'llab-quvvatlaydi. Aslida, ba'zida standart DES-ga asoslangan algoritm MD5-ga asoslangan algoritm bilan almashtiriladi. Xesh turi tuz argumenti tomonidan tetiklanadi. 5.3 dan oldin, PHP tizimning crypt() ga asoslangan holda o‘rnatish vaqtida mavjud algoritmlarni aniqlaydi. Agar tuz berilmasa, PHP avtomatik ravishda standart ikki belgi (DES) tuzini yoki o‘n ikki belgini ( MD5), MD5 crypt() mavjudligiga qarab.PHP nomli doimiyni o'rnatadi CRYPT_SALT_LENGTH bu mavjud xeshlar tomonidan ruxsat etilgan eng uzun amaldagi tuzni bildiradi.

Standart DESga asoslangan crypt() tuzni chiqishning dastlabki ikki belgisi sifatida qaytaradi. Bundan tashqari, u faqat str ning birinchi sakkiz belgisidan foydalanadi, shuning uchun bir xil sakkiz belgi bilan boshlanadigan uzunroq satrlar bir xil natijani yaratadi (bir xil tuz ishlatilganda).

Crypt() funksiyasi bir nechta xesh turlarini qo'llab-quvvatlaydigan tizimlarda berilgan tur mavjudligiga qarab quyidagi konstantalar 0 yoki 1 ga o'rnatiladi:

  • CRYPT_STD_DES- "./0-9A-Za-z" alifbosidan ikki belgili tuzli standart DES asosidagi xesh. Tuzda yaroqsiz belgilardan foydalanish crypt() ning ishlamay qolishiga olib keladi.
  • CRYPT_EXT_DES- kengaytirilgan DES asosidagi xesh. "Tuz" 9 ta belgidan iborat bo'lib, pastki chiziqdan keyin 4 bayt takrorlash soni va 4 bayt tuzdan iborat. Ular chop etiladigan belgilar sifatida kodlangan, har bir belgi uchun 6 bit, birinchi navbatda eng kam ahamiyatli belgi. 0 dan 63 gacha bo'lgan qiymatlar "./0-9A-Za-z" sifatida kodlangan. Tuzda yaroqsiz belgilardan foydalanish crypt() ning ishlamay qolishiga olib keladi.
  • CRYPT_MD5- $1$ dan boshlanadigan o'n ikki belgili tuz bilan MD5 xeshlash
  • CRYPT_BLOWFISH- Baliqni tuz bilan xeshlash quyidagicha: "$2a$", "$2x$" yoki "$2y$", ikki xonali xarajat parametri, "$" va "./0-9A-" alifbosidan 22 ta belgi. Za-z". Tuzda ushbu diapazondan tashqaridagi belgilardan foydalanish crypt() ning nol uzunlikdagi qatorni qaytarishiga olib keladi. Ikki xonali xarajat parametri Blowfish-ga asoslangan asosiy xesh algoritmi uchun iteratsiyalar sonining 2 ta logarifmi bo'lib, 04-31 oralig'ida bo'lishi kerak, bu diapazondan tashqaridagi qiymatlar crypt() ishlamay qolishiga olib keladi. PHP ning 5.3.7 dan oldingi versiyalari tuz prefiksi sifatida faqat "$2a$" ni qo'llab-quvvatlaydi: PHP 5.3.7 Blowfish ilovasidagi xavfsizlik zaifligini tuzatish uchun yangi prefikslarni taqdim etdi. Iltimos, xavfsizlikni tuzatish boʻyicha toʻliq maʼlumotlarga qarang, ammo xulosa qilish uchun faqat PHP 5.3.7 va undan keyingi versiyalarni maqsad qilgan ishlab chiquvchilar “$2a$” oʻrniga “$2y$” dan foydalanishlari kerak.
  • CRYPT_SHA256- $5$ prefiksli o'n olti belgili tuzli SHA-256 xeshi. Agar tuz qatori "rounds=" bilan boshlansa
  • CRYPT_SHA512- $6$ prefiksli o'n olti belgili tuzli SHA-512 xeshi. Agar tuz qatori "rounds=" bilan boshlansa $", N ning raqamli qiymati Blowfish-dagi xarajat parametriga o'xshab, xeshlash siklini necha marta bajarish kerakligini ko'rsatish uchun ishlatiladi. Birlamchi turlar soni 5000, minimal 1000 va maksimal 999,999,999. Ushbu diapazondan tashqarida bo'lgan har qanday N tanlovi eng yaqin chegaraga qisqartiriladi.

PHP 5.3.0 dan boshlab, PHP o'zining ilovasini o'z ichiga oladi va agar tizim bir yoki bir nechta algoritmlarni qo'llab-quvvatlamasa, undan foydalanadi.

Parametrlar

Xeshlangan qator.

Diqqat

dan foydalanish CRYPT_BLOWFISH algoritm, str parametrining maksimal uzunligi 72 belgigacha qisqartirilishiga olib keladi.

Xeshlash uchun ixtiyoriy tuz qatori. Agar taqdim etilmasa, xatti-harakatlar algoritmni amalga oshirish bilan belgilanadi va kutilmagan natijalarga olib kelishi mumkin.

Qaytish qiymatlari

Xeshlangan satrni yoki 13 ta belgidan qisqa boʻlgan va xatolik holatida tuzdan farq qilishi kafolatlangan satrni qaytaradi.

Ogohlantirish

Parollarni tekshirishda, chiqishni solishtirish uchun vaqt hujumlariga zaif bo'lmagan qatorlarni taqqoslash funktsiyasidan foydalanish kerak. crypt() ilgari ma'lum bo'lgan xeshga. PHP 5.6 dan boshlab taqdim etadi hash_equals() shu maqsadda.

O'zgarishlar jurnali

Versiya Tavsif
5.6.5 “*0” xato qatori tuz sifatida berilganda, “*1” endi boshqa kripto ilovalari bilan mos kelishi uchun qaytariladi. Ushbu versiyadan oldin PHP 5.6 noto'g'ri DES xeshini qaytarardi.
5.6.0 Agar tuz o'tkazib yuborilsa, E_NOTICE xavfsizlik ogohlantirishini ko'taring.
5.5.21 “*0” xato qatori tuz sifatida berilganda, “*1” endi boshqa kripto ilovalari bilan mos kelishi uchun qaytariladi. Ushbu versiyadan oldin PHP 5.5 (va oldingi filiallar) noto'g'ri DES xeshini qaytarardi.
5.3.7 Qo'shilgan $2x$ va $2y$ Potensial yuqori bitli hujumlar bilan kurashish uchun Blowfish rejimlari.
5.3.2 Ulrich Drepper » tatbiqiga asoslangan SHA-256 va SHA-512 kriptosi qo'shildi.
5.3.2 Blowfishning noto'g'ri raundlardagi xatti-harakati DESga qaytish o'rniga "muvaffaqiyatsizlik" qatorini ("*0" yoki "*1") qaytarish uchun tuzatildi.
5.3.0 PHP hozirda MD5 kripto, Standard DES, Kengaytirilgan DES va Blowfish algoritmlari uchun o'z ilovasini o'z ichiga oladi va agar tizimda bir yoki bir nechta algoritmlarni qo'llab-quvvatlamasa, undan foydalanadi.

Misollar

№1 misol crypt() misollar

$hashed_password = kripto("mening parolim"); // tuz avtomatik ravishda hosil bo'lsin

/* crypt() ning barcha natijalarini a ni solishtirish uchun tuz sifatida topshirishingiz kerak
turli xil xeshlash algoritmlaridan foydalanilganda muammolarni oldini olish uchun parol. (As
Yuqorida aytilishicha, standart DES-ga asoslangan parolni xeshlash 2 ta belgidan iborat.
lekin MD5-ga asoslangan xeshlash 12 dan foydalanadi.) */
agar (hash_equals ($hashed_password , crypt ($user_input , $hashed_password ) ))) (
echo "Parol tasdiqlandi!" ;
}
?>

2-misol foydalanish crypt() htpasswd bilan

// Parolni o'rnating
$parol = "mening parolim" ;

// Tuzni avtomatik ravishda hosil qilish uchun xeshni oling
$xesh = kripto($parol);
?>

3-misol foydalanish crypt() turli xil hash turlari bilan

/* Ushbu tuzlar faqat misollar va kodingizda so'zma-so'z ishlatilmasligi kerak.
Har bir parol uchun aniq, to'g'ri formatlangan tuzni yaratishingiz kerak.
*/
agar (CRYPT_STD_DES == 1 ) (
echo "Standart DES:" . kripto ("rasmuslerdorf", "rl") . "\n" ;
}

agar (CRYPT_EXT_DES == 1 ) (
echo "Kengaytirilgan DES:" . kripto ("rasmuslerdorf" , "_J9..rasm" ) . "\n" ;
}

agar (CRYPT_MD5 == 1 ) (
echo "MD5:" . kripto ("rasmuslerdorf", "$1$rasmusle$" ) . "\n" ;
}

agar (CRYPT_BLOWFISH == 1 ) (
echo "Blowfish:" . kripto("rasmuslerdorf" , "$2a$07$usesomesillystringforsalt$"). "\n" ;
}

agar (CRYPT_SHA256 == 1 ) (
echo "SHA-256:" . kripto("rasmuslerdorf" , "$5$rounds=5000$usesomesillystringforsalt$"). "\n" ;
}

agar (CRYPT_SHA512 == 1 ) (
echo "SHA-512:" . kripto("rasmuslerdorf" , "$6$rounds=5000$usesomesillystringforsalt$"). "\n" ;
}
?>

Har qanday ma'lumot shifrlanishi yoki shifrlanishi mumkin, shu jumladan PHP yordamida. Bu tilda oddiydan murakkabgacha maʼlumotlarni shifrlash imkoniyatlari koʻp.

Keling, shifrlashning asosiy usullarini ko'rib chiqaylik

baza 64- MIME base64 algoritmi yordamida ma'lumotlarni shifrlash va shifrini ochish imkonini beradi. U kalitlardan foydalanmaydi va ko'pincha PHP da havolalarni yashirish uchun ishlatiladi.

Misollar:
//matnni shifrlash
$text = "Bog'lanish";
echo base64_encode($matn); //Ishlab chiqaradi: PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==
// shifrni ochish
echo base64_decode("PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==");
?>

Ko'rib turganingizdek, biz avval base64_encode operatsiyasidan foydalandik va shifrni oldik: PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==, va keyin uni base64_decode ga almashtirdi va havolani qaytarib oldi.

md5- ma'lumotlarni bir tomonlama xeshlash imkonini beradi. Ya'ni, base64 dan farqli o'laroq, siz endi ularni qayta shifrlay olmaysiz. Ko'pincha md5 parollarni ma'lumotlar bazasida saqlash uchun ishlatiladi, ammo yaqinda shifrlangan md5 kombinatsiyasini ko'plab saytlar va algoritmlar tomonidan taqdim etilgan shifrlash jadvallarida topish oson bo'ldi. Shuning uchun, md5 parollarini saqlash uchun algoritmlarni Blowfish bilan almashtirish yaxshiroqdir.

Misol:

//matnni shifrlash
echo md5 ("kombinatsiya");
?>

Kalit shifrlash

Va men gaplashmoqchi bo'lgan shifrlash/parolni hal qilishning so'nggi misoli kalitdan foydalanadi (parol sifatida). Ya'ni, siz shifrlash funktsiyasiga noyob kalitni o'tkazasiz va kod u bilan birga shifrlanadi. Shifrni ochish uchun funksiyani shifrlangan kod va faqat sizga biladigan kalit bilan ta'minlashingiz kerak. Kodning eng pastki qismidagi funktsiyalardan foydalanishga misol.

funktsiya __encode ($ matn, $ kalit) (



$enc_text=base64_encode(mcrypt_generic($td,$iv.$matn));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$enc_textni qaytarish; ))
strToHex funksiyasi($string) (
$hex="";
uchun ($i=0; $i< strlen($string); $i++) { $hex .= dechex(ord($string[$i])); }
$hexni qaytarish; )
__dekod funksiyasi ($ matn, $ kalit) (
$td = mcrypt_module_open("uchlik", "", "cfb", "");
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
agar (mcrypt_generic_init ($td, $key, $iv) != -1) (
$decode_text = substr(mdecrypt_generic($td, base64_decode($matn)),$iv_size);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$decode_textni qaytarish; ))
funksiya hexToStr($hex) (
$string="";
uchun ($i=0; $i< strlen($hex)-1; $i+=2) { $string .= chr(hexdec($hex[$i].$hex[$i+1])); }
$stringni qaytarish; )

$str = "Shifrlanishi kerak bo'lgan bulkalar!
Kalit orqali";
$kod = strToHex(__encode($str, "My#key-do-36-simvolov"));
echo "Shifrlangan kod: ".$code."
";

$str = __decode(hexToStr($code), "Mening #key-do-36-simvolov");
echo "Shifrlangan kod: ".$str."
";
?>

Siz html mazmunini shifrlashingiz mumkin. Kalit uzunligi 36 ta belgidan oshmasligi kerak.

Bu usul yordamida ba'zi ma'lumotlarni shifrlash va ularni txt fayli yoki ma'lumotlar bazasiga joylashtirish va kalit yordamida shifrni ochish orqali qabul qilish mumkin.

Albatta, har qanday kodni shifrlash/buzish mumkin va bu istisno emas, shuning uchun kuchli shifrlash usullaridan foydalaning.

Kriptografiyaning asosiy haqiqatlaridan biri shundaki, siz professional bo'lmasangiz, bu sohada hech narsa ixtiro qilmasligingiz kerak. Bu qisman to'g'ri, chunki barcha eng yaxshi narsalar uzoq vaqtdan beri ixtiro qilingan, azoblangan va axborot texnologiyalari sohasida o'nlab yillar davomida ishlatilgan. Haqiqatning ikkinchi tomoni shundaki, ma'lum bir bilim sohasining rivojlanishi undagi yangi g'oyalar va original echimlarning doimiy oqimi bilan sodir bo'ladi.

Aniq sabablarga ko'ra, biz AES kabi sanoat kriptografiyasining gigantlarini nishonga olmaymiz, balki blackjack va quvonch bilan o'z kriptografik tadqiqotlarimizga kirishamiz.

Qisman qiziqarli bo'lgani uchun, qisman o'zingizning biror narsani modellashtirish va uni tan olingan standartlar bilan taqqoslash orqali siz kontrastni, samarali echimlarni va aniq kamchiliklarni aniq ko'rasiz va samaradorlikni oshirish uchun nimaga intishingiz mumkinligini tushunasiz.

Ammo suv allaqachon etarli.

Aytaylik, bizning veb-ilovamiz PHP-da yozilgan, teskari shifrlashni talab qiladi va biz o'z shifrlash tizimimizni yozishimiz mumkinligiga ishonamiz.

Shunday qilib, keling, shaxsiy va ochiq kalitlar bilan o'zimizning qaytariladigan shifrlash tizimimizni yozaylik, u ko'proq yoki kamroq xavfsiz kriptografik algoritmning quyidagi xususiyatlariga ega bo'ladi:

  1. Yakuniy shifrda shovqin belgilarining mavjudligi.
  2. Har bir jo'natuvchi-maqsad kanalidagi ma'lumotlar shaxsiy kalit yordamida shifrlanadi va mos keladigan funksiya har bir kalit uchun noyob bo'ladi.
  3. Har bir xabar dayjest kodini oladi - bu shaxsiy kalit va asl xabarning funktsiyasi bo'lgan noyob kod. Bu "manba belgisi" moslashuv funktsiyasining o'ziga xosligiga erishish uchun talab qilinadi<=>"kodlangan belgi" nafaqat "Yuborish-qabul qiluvchi" kanali uchun, balki har bir alohida xabar uchun.

    Shunday qilib, agar biz ma'lum bir xabar uchun kodlangan va original belgilarning muvofiqligi kriptografik tahlil, masalan, chastota tahlili yordamida ma'lum bo'lgan deb tasavvur qilsak ham, bu boshqa xabarni o'rganishda hech qanday afzalliklarni bermaydi.

  4. Chastotani tahlil qilishni murakkablashtirish uchun biz har bir dastlabki xabar belgisini ikkita shifr belgisi bilan kodlaymiz.
Xo'sh, nima bo'ldi.

Aslida, siz yakuniy natijani ko'rishingiz mumkin

SymCoder klassi shifrlash va shifrni ochish usullarini o'z ichiga oladi.

Shifrlash kod() usuli bilan amalga oshiriladi, u asl xabarni kirish sifatida qabul qiladi.

Bu erda tab_coded-da yaratilgan yozishmalar jadvalidan kelgan xabar chekkalari bo'ylab va ichkarida shovqin belgilari bilan suyultirilgan shifrlangan xabarni yaratadi.

Aytgancha, shovqin belgilari har bir jo'natuvchi-maqsad kanali uchun noyobdir, chunki ular kanal kaliti yordamida yaratiladi, ammo xabarlar uchun yagona emas. Code_symbols da shifrlash uchun ishlatiladigan belgilar tinish belgilari va %, @ va boshqalar kabi belgilardir.

Har bir kodlangan belgi uchun code_symbols dan ikkita belgi mavjud, chunki aniq sabablarga ko'ra ularning kodlangan belgilarga qaraganda bir necha barobar kamroq.

create_tab_coded yozishmalar jadvali xabar kaliti xeshini elementlar soni kod belgilari massividagi elementlar soniga teng bo'lgan massivga tarjima qilish yordamida tuzilgan. Ikki belgili kodlarni kesib o'tishning boshlang'ich pozitsiyasi ham har doim farq qiladi va kanal kaliti bilan bog'liq. Bu kodlangan belgilarni kesib o'tish algoritmi va ularga mos keladigan kod belgilari har doim (yoki tez-tez kafolatlangan) boshqacha bo'lishiga ishonch hosil qilish imkonini beradi.

Masalan, "salom dunyo" xabari kodlanganda shunday ko'rinadi:

Digest-a00bf11d-&?==&!&?.@.@=!=-.?&1.#&?=:.:.1%!&-%@&@%~&1^#=?%% .!%+.?.~=?..&?%&&:%~.#%@&1&1.#=?.#.?.!&1==&=.-=!

Va bu erda yana bir xil xabar kodlangan:

Digest-a00bf11d-=:.?=:&!.?.1&-=:=?.?.=.?.!&=%!=-%@=!%~.=^#.1%%. !%+=:.~.@..==%&&1%~.1%@=?.@.!&=.!&@=:&1.==:=!.1&:

Ko'rinib turibdiki, bir xil xabarning dayjesti bir xil, ammo shifr boshqacha bo'ladi - shovqin belgilari har bir yangi shifrlash uchun o'zboshimchalik bilan mos keladigan va o'zboshimchalik bilan qo'shiladi.

Xabarlarda ortiqcha bo'ladi, bu xabar hajmining oshishi bilan kamayadi, shovqin 10% gacha (eng qisqa xabarlar uchun shovqin 90% yoki undan yuqori foizga etadi), shifrlangan xabarning minimal uzunligi 116 belgini tashkil qiladi. Ushbu shifrlash usulining kamchiliklaridan biri shundaki, kodlangan xabarlar kamida ikki baravar ko'payadi.

Dekodlash "kod belgisi" shaklini teskari tarjima qilishdan iborat - xabardan shovqinsiz asl belgi. Kalit nima bo'lishi mumkin? Asosan, har bir maqsad-qabul qiluvchi juftligi uchun noyob bo'lgan har qanday qator.

Misol uchun, agar siz xabarlarni shifrlash bilan messenjer yaratayotgan bo'lsangiz, shaxsiy kalitning eng oddiy versiyasi md5 ($user_id_1. $salt. $user_id_2) bo'lishi mumkin, u holda kalit har bir xabar kanali uchun noyob bo'ladi.

Aytaylik, siz ikkita server o'rtasida ma'lumot almashishingiz kerak. Ma'lumotlarni tinglash trafikdan himoya qilish uchun ma'lumotlar shifrlangan. Masalan, botnet ichidagi harakatlarni uzatish. Bu aslida shifrlash emas, balki kodlash deb ataladi va bunday kodni dekodlash uchun taniqli funktsiyalardan foydalaniladi.

Pseudo-shifrlashning yana bir misoli sifatida, men bitta CMS ma'lumotlar bazasida parollarni "shifrlash" misolini keltiraman - bu erda parollar md5() yoki da shifrlanmagan, balki oddiygina base64 orqali kodlangan. Bular. Ma'lumotlar bazasi sizdirilganda, xaker uchun PHP o'rnatilgan base64_decode() funksiyasidan foydalangan holda barcha parollarni parolini ochish qiyin bo'lmaydi.

Kimdir matnni ushlab olishi va shifrini ochishi mumkinligidan xavotirlanmasdan ma'lumotlarni uzatishimiz kerak. PHP-da Mcrypt deb nomlangan mashhur ma'lumotlarni shifrlash paketi mavjud bo'lib, u ikki tomonlama shifrlashni (ya'ni, ma'lumotlarni haqiqiy shifrlash va dekodlash) ta'minlaydi.

Mcrypt 2.4.7 versiyasi quyidagi simmetrik shifrlash algoritmlarini qo‘llab-quvvatlaydi: Blowfish, RC2, Safer-sk64 xtea, Cast-256, RC4, Safer-sk128, DES, RC4-iv, Serpent, Enigma, Rijndael-128, Threeway, Rijndael-192j , TripleDES, LOKI97, Rijndael-256, Twofish, Panama, Saferplus va boshqalar. Har bir algoritm haqida batafsil ma'lumot Vikipediyada yozilgan.

Simmetrik shifrlash qo'llanilganligi sababli, kalit har ikki tomon uchun ham ma'lum bo'lishi va sir saqlanishi kerak.

Satrni shifrlash va dekodlash misoli

mcrypt_module_open("des", "", "ecb", "")
Bu funksiya algoritm moduli va ishlatiladigan rejimni ochadi. Ushbu misol uchun DES algoritmi ECB rejimida.

$key = substr($key, 0, mcrypt_enc_get_key_size($td));
Maksimal kalit hajmi mcrypt_enc_get_key_size() funksiyasini chaqirish orqali olinishi kerak va undan kichikroq qiymat to'g'ri bo'ladi.

$s = mcrypt_generic($td, $manba);
Shifrlashda ma'lumotlar n * blok o'lchamda bo'lishini ta'minlash uchun ma'lumotlar nol bayt bilan to'ldiriladi. Blok o'lchami blok o'lchami algoritm bilan belgilanadi (DES uchun blok hajmi 64 bit). Shuning uchun, shifrni ochishda trim() funksiyasi tomonidan olib tashlanadigan satr oxirida “\0” paydo bo'lishi mumkin.