1-bo‘lim
Kriptografiya nima va nima emas
Kriptografiya qaysi muammolarni yechadi, qaysilarini umuman yechmaydi - va kodlash nima uchun shifrlash emas.
Ushbu bo‘lim mundarijasi
Kriptografiya - ma'lumotni matematik usullar bilan himoyalash sohasi. U kiberxavfsizlikning poydevori, lekin sehrli qalqon emas.
Bu darslikning birinchi vazifasi - kutilmalarni to'g'rilash.
Kriptografiya nimani yechadi #
| Xususiyat | Savolga javob beradi | Vosita |
|---|---|---|
| Maxfiylik | Kim o'qiy oladi? | Shifrlash |
| Butunlik | Ma'lumot o'zgartirilganmi? | Xesh, MAC |
| Autentiklik | Buni kim yubordi? | HMAC, raqamli imzo |
| Rad eta olmaslik | Yuboruvchi inkor qila oladimi? | Raqamli imzo |
Kriptografiya nimani yechmaydi #
| Muammo | Nima uchun kriptografiya yordam bermaydi |
|---|---|
| SQL in'yeksiyasi | Hujum shifrlangan ulanish ichida boradi |
| Noto'g'ri kirish nazorati | Foydalanuvchi o'z kaliti bilan begona ma'lumotni ochadi |
| Xodimning suiiste'moli | Uning kaliti bor |
| Xizmatdan voz kechish (DoS) | Server baribir javob bermaydi |
| Zaif parol | Shifrlash uni kuchaytirmaydi |
| Kalitni GitHub ga yuklab yuborish | Eng kuchli algoritm ham foydasiz |
Amalda buzilishlarning katta qismi kriptografiyani buzish orqali emas, uni chetlab o'tish orqali sodir bo'ladi.
Hujumchi AES ni sindirmaydi - u kalit yozilgan konfiguratsiya faylini topadi.
Kodlash shifrlash emas #
Eng ko'p uchraydigan chalkashlik. Boshlaymiz:
function korsat(string $nom, string $qiymat): void
{
printf("%-10s %s%s", $nom . ':', $qiymat, PHP_EOL);
}
$sir = 'Karta raqami: 8600 1234 5678 9012';
korsat('asl', $sir);
korsat('base64', base64_encode($sir));
korsat('hex', bin2hex($sir));
korsat('rot13', str_rot13($sir));
asl: Karta raqami: 8600 1234 5678 9012
base64: S2FydGEgcmFxYW1pOiA4NjAwIDEyMzQgNTY3OCA5MDEy
hex: 4b6172746120726171616d693a2038363030203132333420353637382039303132
rot13: Xnegn endnzv: 8600 1234 5678 9012
Uchalasi ham "tushunarsiz" ko'rinadi. Endi ularni kalitsiz qaytaramiz:
$sir = 'Karta raqami: 8600 1234 5678 9012';
korsat('base64', base64_decode(base64_encode($sir)));
korsat('hex', hex2bin(bin2hex($sir)));
korsat('rot13', str_rot13(str_rot13($sir)));
echo PHP_EOL, 'Hech qanday kalit ishlatilmadi.', PHP_EOL;
base64: Karta raqami: 8600 1234 5678 9012
hex: Karta raqami: 8600 1234 5678 9012
rot13: Karta raqami: 8600 1234 5678 9012
Hech qanday kalit ishlatilmadi.
base64 - shifrlash emasbase64_encode - bu kodlash: baytlarni boshqa alifboda
yozish usuli. Uning maqsadi - ikkilik ma'lumotni matn
sifatida uzatish, yashirish emas.
| Kodlash | Shifrlash | |
|---|---|---|
| Kalit kerakmi | Yo'q | Ha |
| Maqsadi | Uzatish/saqlash formati | Maxfiylik |
| Kim qaytara oladi | Har kim | Faqat kalit egasi |
| Misol | base64, hex, URL-encode | AES, ChaCha20 |
Real hodisalar ro'yxatida "parollar base64 da saqlangan" degan yozuv juda tez-tez uchraydi. Bu parollar ochiq matnda saqlangani bilan bir xil.
Xuddi shu narsa rot13 va boshqa "almashtirish"
usullariga tegishli.
O'z algoritmingizni yozmang #
Ko'pchilik "oddiy XOR yetarli" deb o'ylaydi. Sinab ko'ramiz:
// FAQAT O'QUV MAQSADIDA - real kodda hech qachon ishlatmang
function oddiyXor(string $matn, string $kalit): string
{
$natija = '';
$n = strlen($kalit);
for ($i = 0, $uz = strlen($matn); $i < $uz; $i++) {
$natija .= $matn[$i] ^ $kalit[$i % $n];
}
return $natija;
}
$matn = 'AAAAAAAAAAAA';
$shifr = oddiyXor($matn, 'sir');
echo bin2hex($shifr), PHP_EOL;
echo 'kalit uzunligi: ', strlen('sir'), PHP_EOL;
322833322833322833322833
kalit uzunligi: 3
Chiqishga qarang: 322833 ketma-ketligi to'rt marta
takrorlandi.
Bu shifrning kalit uzunligi uch bayt ekanini shifrni ochmasdan aytib beradi. Hujumchiga kalitning o'zi ham kerak emas - u shunchaki takrorlanish davrini o'lchaydi.
Buni dastur bilan topish oson:
$shifr = oddiyXor(str_repeat('A', 60), 'sir');
// takrorlanuvchi blok uzunligini qidiramiz
for ($uzunlik = 1; $uzunlik <= 8; $uzunlik++) {
$birinchi = substr($shifr, 0, $uzunlik);
$ikkinchi = substr($shifr, $uzunlik, $uzunlik);
if ($birinchi === $ikkinchi) {
echo "topilgan kalit uzunligi: {$uzunlik}", PHP_EOL;
break;
}
}
echo 'urinishlar soni: ', $uzunlik, PHP_EOL;
topilgan kalit uzunligi: 3
urinishlar soni: 3
Uchta urinishda kalit uzunligi aniqlandi. Haqiqiy matnda esa tilning harf chastotasi qolgan ishni bajaradi.
Kerkxoffs tamoyili #
// Algoritm butun dunyoga ma'lum, sir faqat kalitda
$kalit = hex2bin(str_repeat('a1', 32));
$nonce = hex2bin(str_repeat('b2', 12));
$tag = '';
$shifr = openssl_encrypt('Maxfiy hisobot', 'aes-256-gcm', $kalit,
OPENSSL_RAW_DATA, $nonce, $tag);
echo 'algoritm: aes-256-gcm', PHP_EOL;
echo 'shifrmatn: ', bin2hex($shifr), PHP_EOL;
echo 'teg: ', bin2hex($tag), PHP_EOL;
// To'g'ri kalit bilan
$togri = openssl_decrypt($shifr, 'aes-256-gcm', $kalit,
OPENSSL_RAW_DATA, $nonce, $tag);
// Bitta bayti farq qiladigan kalit bilan
$notogri = openssl_decrypt($shifr, 'aes-256-gcm',
hex2bin(str_repeat('a1', 31) . 'a2'), OPENSSL_RAW_DATA, $nonce, $tag);
var_dump($togri);
var_dump($notogri);
algoritm: aes-256-gcm
shifrmatn: 79f9e5046a6c6f4cb5262520ef6e
teg: 4935fe364e1dd40235a0bd6537a8cd68
string(14) "Maxfiy hisobot"
bool(false)
Bitta bayt farq qilgan kalit hech qanday ma'lumot
bermadi - false qaytdi. Bu to'g'ri xulq: shifr ham
ochilmadi, butunlik tekshiruvi ham o'tmadi.
str_repeat('a1', 32) - takrorlanuvchi, oldindan ma'lum
kalit. U shu yerda natija har safar bir xil chiqishi
uchun ishlatilgan.
Real kodda kalit hech qachon shunday yozilmaydi. To'g'ri usullar 6- va 18-bo'limlarda ko'riladi:
| Kerak | Vosita |
|---|---|
| Tasodifiy kalit | random_bytes(32) |
| Paroldan kalit | Argon2id yoki PBKDF2 |
| Saqlash | Muhit o'zgaruvchisi, kalit ombori |
Xuddi shu nonce ga ham tegishli - u takrorlanmasligi
kerak (9-bo'lim).
"O'zingiz yozmang" nimani anglatadi #
"Don't roll your own crypto" degani kriptografiyani o'rganmang degani emas.
| Nima qilmaslik kerak | Nima qilish kerak |
|---|---|
| Yangi shifrlash algoritmi o'ylab topish | Mavjudlarini to'g'ri tanlash |
| AES ni o'zingiz yozish | Kutubxona funksiyasini chaqirish |
| "Yaxshilangan" xesh yasash | Argon2id parametrlarini to'g'ri qo'yish |
| Protokol ixtiro qilish | TLS, JWT kabi standartlarni to'g'ri ishlatish |
Amalda zaifliklarning katta qismi algoritmda emas, birlashtirishda:
| Xato | Bo'lim |
|---|---|
| Nonce takrorlangan | 9 |
| ECB rejimi ishlatilgan | 7 |
| MAC tekshirilmagan | 8 |
| Kalit koddan chiqmagan | 18 |
== bilan solishtirilgan | 2 |
Shuning uchun ushbu darslik primitivlarni yozishni emas, ularni to'g'ri birlashtirishni o'rgatadi.
Bu darslikda nima bo'ladi #
| Bo'limlar | Mavzu |
|---|---|
| 1-2 | Asoslar, baytlar, doimiy vaqtda solishtirish |
| 3-6 | Xesh, parol saqlash, HMAC, kalit hosil qilish |
| 7-9 | Simmetrik shifrlash, AEAD, nonce |
| 10-12 | Ochiq kalit, imzo, kalit almashinuvi |
| 13-14 | Sertifikatlar va TLS |
| 15-18 | Tasodifiylik, saqlashda shifrlash, tokenlar, kalit boshqaruvi |
| 19 | Eng ko'p uchraydigan xatolar |
| 20 | Amaliy loyiha - shifrlangan sirlar sandig'i |
Ushbu darslik himoya uchun yozilgan. Barcha misollar o'z tizimingizni himoyalash, kodni to'g'ri yozish va zaifliklarni tushunish maqsadida keltirilgan.
Begona tizimga ruxsatsiz kirish yoki begona ma'lumotni ochishga urinish - jinoyat. O'rganish uchun faqat o'zingizning mashinangiz, o'zingizning ma'lumotingiz va maxsus tayyorlangan mashq muhitlaridan foydalaning.
Darslikdagi hech bir misol tayyor hujum vositasi emas va shunday bo'lishi ham ko'zda tutilmagan.
- Kriptografiya yechadigan to'rtta xususiyatni yozing.
- U yechmaydigan beshta muammoni sanang.
base64_encodeva shifrlash farqini o'z so'zlaringiz bilan tushuntiring.- Bir satrni base64, hex va rot13 da kodlang va kalitsiz qaytaring.
- Takrorlanuvchi kalitli XOR bilan
str_repeat('A', 60)ni shifrlang. - Chiqishdagi takrorlanish davrini toping.
- Kalitni 5 baytga o'zgartiring va davr o'zgarishini kuzating.
- Kerkxoffs tamoyilini bir jumlada yozing.
- AES-GCM da bitta bayt farq qilgan kalit bilan ochishga urinib ko'ring.
- "O'z kriptografiyangizni yozmang" nimani taqiqlab, nimani taqiqlamasligini yozing.
Xulosa #
- Kriptografiya maxfiylik, butunlik, autentiklik va rad eta olmaslikni ta'minlaydi.
- U kirish nazorati, in'yeksiya, DoS va zaif parol muammolarini yechmaydi.
- Buzilishlar ko'pincha kriptografiyani buzish orqali emas, uni chetlab o'tish orqali sodir bo'ladi.
- Kodlash shifrlash emas: base64, hex va rot13 kalitsiz qaytariladi.
- Xeshlash - bir tomonlama, shifrlash - qaytariladigan; ular har xil maqsad uchun.
- O'zi yozilgan XOR shifri kalit uzunligini oshkor qiladi.
- Kerkxoffs tamoyili: algoritm ochiq bo'lsa ham tizim xavfsiz qolishi kerak; sir faqat kalitda.
- Noto'g'ri kalit bilan AES-GCM hech qanday ma'lumot bermaydi -
falseqaytaradi. - "O'z kriptografiyangizni yozmang" - primitivga tegishli, birlashtirishni o'rganish shart.
- Zaifliklarning katta qismi algoritmda emas, uni noto'g'ri ishlatishda.
Keyingi bo'limda baytlar, kodlash formatlari va doimiy vaqtda solishtirish bilan tanishamiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.