1-bo‘lim

Kriptografiya nima va nima emas

Kriptografiya qaysi muammolarni yechadi, qaysilarini umuman yechmaydi - va kodlash nima uchun shifrlash emas.

🕑 12 daqiqa o‘qish 📄 1 036 so‘z 👁 1 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Kriptografiya nimani yechadi
  2. Kriptografiya nimani yechmaydi
  3. Kodlash shifrlash emas
  4. O'z algoritmingizni yozmang
  5. Kerkxoffs tamoyili
  6. "O'zingiz yozmang" nimani anglatadi
  7. Bu darslikda nima bo'ladi
  8. Xulosa

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 #

XususiyatSavolga javob beradiVosita
MaxfiylikKim o'qiy oladi?Shifrlash
ButunlikMa'lumot o'zgartirilganmi?Xesh, MAC
AutentiklikBuni kim yubordi?HMAC, raqamli imzo
Rad eta olmaslikYuboruvchi inkor qila oladimi?Raqamli imzo

Kriptografiya nimani yechmaydi #

Bu ro'yxat birinchisidan muhimroq
MuammoNima uchun kriptografiya yordam bermaydi
SQL in'yeksiyasiHujum shifrlangan ulanish ichida boradi
Noto'g'ri kirish nazoratiFoydalanuvchi o'z kaliti bilan begona ma'lumotni ochadi
Xodimning suiiste'moliUning kaliti bor
Xizmatdan voz kechish (DoS)Server baribir javob bermaydi
Zaif parolShifrlash uni kuchaytirmaydi
Kalitni GitHub ga yuklab yuborishEng 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:

PHP
function korsat(string $nom, string $qiymat): void
{
    printf("%-10s %s%s", $nom . ':', $qiymat, PHP_EOL);
}
PHP
$sir = 'Karta raqami: 8600 1234 5678 9012';

korsat('asl', $sir);
korsat('base64', base64_encode($sir));
korsat('hex', bin2hex($sir));
korsat('rot13', str_rot13($sir));
Natija
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:

PHP
$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;
Natija
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 emas

base64_encode - bu kodlash: baytlarni boshqa alifboda yozish usuli. Uning maqsadi - ikkilik ma'lumotni matn sifatida uzatish, yashirish emas.

KodlashShifrlash
Kalit kerakmiYo'qHa
MaqsadiUzatish/saqlash formatiMaxfiylik
Kim qaytara oladiHar kimFaqat kalit egasi
Misolbase64, hex, URL-encodeAES, 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:

PHP
// 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;
}
PHP
$matn = 'AAAAAAAAAAAA';
$shifr = oddiyXor($matn, 'sir');

echo bin2hex($shifr), PHP_EOL;
echo 'kalit uzunligi: ', strlen('sir'), PHP_EOL;
Natija
322833322833322833322833
kalit uzunligi: 3
Naqsh ko'rinib turibdi

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:

PHP
$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;
Natija
topilgan kalit uzunligi: 3
urinishlar soni: 3

Uchta urinishda kalit uzunligi aniqlandi. Haqiqiy matnda esa tilning harf chastotasi qolgan ishni bajaradi.

Kodlash, xeshlash va shifrlash - uch xil narsa Kodlash base64, hex, URL matn kod kalitsiz qaytariladi maxfiylik BERMAYDI Xeshlash SHA-256, Argon2id matn xesh × bir tomonlama qaytarib bo'lmaydi Shifrlash AES-GCM, ChaCha20 matn shifr faqat KALIT bilan maxfiylik beradi Kerkxoffs tamoyili (1883) Tizim algoritmi ma'lum bo'lsa ham xavfsiz qolishi kerak. Sir faqat kalitda bo'ladi. Amaliy qoida Primitivni o'zingiz yozmang. Lekin tayyorlarini to'g'ri birlashtirishni bilishingiz shart.
Uch amal - uch xil maqsad; ularni chalkashtirish eng keng tarqalgan xato

Kerkxoffs tamoyili #

PHP
// 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);
Natija
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.

Kalit qattiq yozilgani - faqat misol uchun

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:

KerakVosita
Tasodifiy kalitrandom_bytes(32)
Paroldan kalitArgon2id yoki PBKDF2
SaqlashMuhit o'zgaruvchisi, kalit ombori

Xuddi shu nonce ga ham tegishli - u takrorlanmasligi kerak (9-bo'lim).

"O'zingiz yozmang" nimani anglatadi #

Bu maslahat ko'pincha noto'g'ri tushuniladi

"Don't roll your own crypto" degani kriptografiyani o'rganmang degani emas.

Nima qilmaslik kerakNima qilish kerak
Yangi shifrlash algoritmi o'ylab topishMavjudlarini to'g'ri tanlash
AES ni o'zingiz yozishKutubxona funksiyasini chaqirish
"Yaxshilangan" xesh yasashArgon2id parametrlarini to'g'ri qo'yish
Protokol ixtiro qilishTLS, JWT kabi standartlarni to'g'ri ishlatish

Amalda zaifliklarning katta qismi algoritmda emas, birlashtirishda:

XatoBo'lim
Nonce takrorlangan9
ECB rejimi ishlatilgan7
MAC tekshirilmagan8
Kalit koddan chiqmagan18
== bilan solishtirilgan2

Shuning uchun ushbu darslik primitivlarni yozishni emas, ularni to'g'ri birlashtirishni o'rgatadi.

Bu darslikda nima bo'ladi #

Bo'limlarMavzu
1-2Asoslar, baytlar, doimiy vaqtda solishtirish
3-6Xesh, parol saqlash, HMAC, kalit hosil qilish
7-9Simmetrik shifrlash, AEAD, nonce
10-12Ochiq kalit, imzo, kalit almashinuvi
13-14Sertifikatlar va TLS
15-18Tasodifiylik, saqlashda shifrlash, tokenlar, kalit boshqaruvi
19Eng ko'p uchraydigan xatolar
20Amaliy loyiha - shifrlangan sirlar sandig'i
Qonuniy va axloqiy chegara

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.

Amaliy topshiriq
  1. Kriptografiya yechadigan to'rtta xususiyatni yozing.
  2. U yechmaydigan beshta muammoni sanang.
  3. base64_encode va shifrlash farqini o'z so'zlaringiz bilan tushuntiring.
  4. Bir satrni base64, hex va rot13 da kodlang va kalitsiz qaytaring.
  5. Takrorlanuvchi kalitli XOR bilan str_repeat('A', 60) ni shifrlang.
  6. Chiqishdagi takrorlanish davrini toping.
  7. Kalitni 5 baytga o'zgartiring va davr o'zgarishini kuzating.
  8. Kerkxoffs tamoyilini bir jumlada yozing.
  9. AES-GCM da bitta bayt farq qilgan kalit bilan ochishga urinib ko'ring.
  10. "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 - false qaytaradi.
  • "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.

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.