Fəsil 06 · 7 dəq oxu

Kriptoqrafiya və data protection

Kriptoqrafiya və data protection

Kriptoqrafiya nadir hallarda riyaziyyat səviyyəsində sınır. AES-i heç kim sındırmır. Sınan onun ətrafındakı hər şeydir: kodda unudulmuş key, söndürülmüş certificate check-i, password üçün seçilmiş sürətli , log-a düşmüş kart nömrəsi. OWASP bu kateqoriyanı "Cryptographic Failures" adlandırır və nəticəsi demək olar ki, həmişə eynidir: sensitive data exposure, sonra isə data breach. Bu fəsil alqoritmlərdən çox onların düzgün istifadəsi haqqındadır.

Kriptoqrafiya nə verir, nə vermir

Düzgün istifadə olunanda kriptoqrafiya üç xassə verir:

  • : key-i olmayan data-nı oxuya bilmir.
  • : data dəyişdirilibsə, bu aşkar olunur.
  • Authenticity: data-nın kimdən gəldiyini sübut etmək olur.

Vermədikləri də eyni dərəcədə vacibdir. deyil: application data-nı decrypt edib istənilən istifadəçiyə qaytarırsa, disk-in encrypt olunması heç nəyi qorumur. key-in özündən güclü deyil: key ciphertext-in yanında saxlanırsa, sadəcə əlavə addım yaratmısınız. Və kriptoqrafiya compromise olunmuş endpoint-i qoruya bilmir: attacker server-dədirsə, o da decrypt olunmuş data-nı görür.

Symmetric və asymmetric

Symmetric eyni key ilə encrypt və decrypt edir. Sürətlidir və böyük həcmli data üçün istifadə olunan budur. Problem key-in paylanmasıdır: hər iki tərəf eyni bilməlidir.

Asymmetric key cütündən istifadə edir: public key ilə encrypt olunanı yalnız private key açır, private key ilə sign olunanı isə hər kəs public key ilə verify edə bilir. Yavaşdır, buna görə də praktikada iki iş görür: key exchange və digital signature. məhz belə işləyir: asymmetric kriptoqrafiya ilə razılaşdırılmış session key, sonra symmetric ilə trafik.

Authenticated encryption

Müasir symmetric authenticated olmalıdır: ciphertext həm gizlədilir, həm də dəyişdirilməyə qarşı qorunur. Default seçimlər AES-GCM və ChaCha20-Poly1305-dir. Bunlar decrypt zamanı manipulyasiya olunmuş ciphertext-i rədd edir.

Tipik uğursuzluqlar:

  • ECB mode. Eyni plaintext block-ları eyni ciphertext block-larına çevrilir; data-nın strukturu görünür qalır.
  • olmadan CBC və ya CTR. Attacker ciphertext-i dəyişə bilir və padding oracle kimi attack-lər mümkün olur.
  • Nonce reuse. AES-GCM-də eyni key ilə eyni nonce-un iki dəfə istifadəsi həm , həm də məhv edir. Nonce-u random yaradın və ya library-yə buraxın.

Bu detalları özünüz idarə etməməlisiniz. Fəsil 4-də deyildiyi kimi, safe default-ları olan high-level library seçin; düzgün API sizə mode və nonce seçimi buraxmır.

Hash, MAC, signature, password hash

Bu dörd alət tez-tez qarışdırılır, halbuki fərqli suallara cavab verir:

AlətNümunəNə sübut edirKey
SHA-256Data dəyişməyib (əgər özü etibarlı yerdən gəlirsə)Yoxdur
HMAC-SHA256Data dəyişməyib və key-i bilən tərəfdən gəlibShared
Digital signatureEd25519, ECDSAData dəyişməyib və private key sahibindən gəlib; hər kəs verify edə bilərPrivate/public cüt
Password Argon2id, bcryptDaxil edilən password saxlanana uyğundurHər password üçün salt

Adi heç vaxt üçün istifadə etməyin: key olmadığı üçün attacker data-nı dəyişib yenidən hesablaya bilər. və daxili mesajları ilə, və token-ləri signature ilə qoruyun. və signature yoxlamasını constant-time müqayisə ilə edin. Password-lər üçün Fəsil 3-dəki qayda qüvvədədir: yavaş, salt-lı, məqsədli password ; heç vaxt MD5, SHA-1 və ya hətta SHA-256 təkbaşına.

Randomness

Key-lər, nonce-lar, session ID-ləri, password reset token-ləri və təxmin edilməz olmalıdır. Onları yalnız CSPRNG ilə, yəni əməliyyat sisteminin kriptoqrafik random mənbəyi ilə yaradın. Dillərin standart "random" funksiyaları adətən statistik generator-dur: ardıcıllıq bir neçə çıxışdan sonra proqnozlaşdırıla bilir. Vaxt damğasından, user ID-dən və ya counter-dən törədilmiş token random deyil.

Key management

Real uğursuzluqların əksəriyyəti burada baş verir. Alqoritm düzgün seçilir, key isə config faylında, environment variable-da, ya da ən pisi, encrypt etdiyi data ilə eyni database-də qalır.

  • Key-ləri data-dan ayırın. Key-lər və ya HSM-də yaşayır; application onlara identity vasitəsilə, ilə access edir. Database backup-ı oğurlanırsa, key-lər onunla birlikdə getmir.
  • . Hər obyekt və ya record qrupu öz data key-i ilə encrypt olunur; data key-in özü isə master key ilə encrypt olunub data-nın yanında saxlanır. Master key heç vaxt tərk etmir, böyük data isə göndərilmir.
  • Rotation. Key-lər cədvəl üzrə və hər şübhəli incident-dən sonra rotate olunur. Rotation-u əvvəlcədən dizayn edin: ciphertext hansı key versiyası ilə encrypt olunduğunu daşımalıdır, əks halda köhnə data-nı oxumaq üçün köhnə key-i əbədi saxlamalı olursunuz.
  • Bir key, bir məqsəd. key-i signing üçün, production key-i test üçün istifadə olunmur.
  • Key-in məhv edilməsi silmədir. Data key-ini məhv etmək onunla encrypt olunmuş bütün data-nı oxunmaz edir. Bu, backup-lardakı data-nı silməyin praktik yoludur.
encrypt(record):
  data_key           = kms.generate_data_key(master_key_id)
  ciphertext         = aead_encrypt(data_key.plaintext, record)
  store(ciphertext, data_key.encrypted, master_key_id, key_version)
  wipe(data_key.plaintext)

Data in transit

Şəbəkədən keçən hər şey ilə encrypt olunur, istisnasız:

  • minimum, üstünlük. SSL və 1.0/1.1 söndürülür, zəif cipher suite-lər bağlanır.
  • HTTPS hər yerdə, HSTS ilə, browser-in HTTP-yə downgrade olmaması üçün. Plain HTTP yalnız HTTPS-ə redirect edir.
  • Certificate validation heç vaxt söndürülmür. "Test üçün müvəqqəti" verify=false production-a çatır və man-in-the-middle-a qapı açır. Daxili CA lazımdırsa, onu trust store-a əlavə edin.
  • Daxili trafik də encrypt olunur. Fəsil 3-dəki prinsipinə uyğun olaraq service-lərarası trafik "içəri" olduğu üçün etibarlı deyil. hər iki tərəfi authenticate edir və workload identity verir. Onun platforma səviyyəsində necə qurulduğu Fəsil 8-dədir.
  • Certificate-lərin vaxtı avtomatik yenilənir. Expire olmuş certificate-in yaratdığı , insanları validation-u söndürməyə sövq edən ən çox rast gəlinən səbəbdir.

Data at rest

Data at rest fərqli səviyyələri fərqli təhdidlərdən qoruyur:

SəviyyəNədən qoruyurNədən qorumur
Disk / volume Oğurlanmış disk, atılmış hardware, snapshot-ın səhv yerə kopyalanmasıApplication, , database-ə access-i olan admin
Database / storage Storage layer-ə birbaşa access, backup fayllarıDatabase-ə qanuni qoşulan hər kəs
Field-level / application Database admin-i, ilə dump, analitika sistemlərinə sızmaApplication-ın özünün compromise olunması

Disk baseline-dır və demək olar ki, pulsuzdur. Ən sensitive field-lər, məsələn, identity sənəd nömrələri, sağlamlıq data-sı, bank rekvizitləri isə application səviyyəsində encrypt olunmalıdır, belə ki, database dump-ı tək başına faydasız olsun. : encrypt olunmuş field üzərində axtarış və sort çətinləşir; bunun üçün ayrıca keyed index lazımdır.

Sensitive data handling

Ən yaxşı qorunan data sizdə olmayan data-dır.

  • . Data-nı səviyyələrə bölün, məsələn, public, internal, confidential, restricted. Control-lar səviyyəyə uyğun seçilir; hər şeyə eyni yanaşma ya baha, ya da zəif olur.
  • Minimisation. Lazım olmayan field-i toplamayın. Kart nömrəsi lazımdırsa, payment provider-in token-i ilə kifayətlənin. Doğum tarixi əvəzinə "18 yaşdan yuxarı" flag-i kifayət edə bilər.
  • Log-lara yazmayın. Password-lər, token-lər, kart nömrələri, tam request body-ləri log-a düşmür. Log pipeline-ında masking tətbiq edin; log-lar adətən production data-dan daha geniş access-ə malikdir.
  • Masking və . UI və support tool-ları yalnız son dörd rəqəmi göstərir. sensitive dəyəri ayrıca vault-da saxlayır, qalan sistemlər isə mənasız token ilə işləyir.
  • Retention və deletion. Hər data növünün saxlanma müddəti olsun və müddəti bitəndə avtomatik silinsin, backup-lar da daxil olmaqla. Saxlamadığınız data breach-də sızmır.
  • API cavabları. Ən çox rast gəlinən exposure ilə bağlı deyil: endpoint bütün obyekti serialize edir və client-ə lazım olmayan field-lər, məsələn, password_hash, daxili flag-lər, başqa istifadəçilərin data-sı cavaba düşür. Fəsil 7 bunu ətraflı əhatə edir.

Ümumi cryptographic failure-lar

Code review və audit zamanı bunları axtarın:

  • Password-lər üçün MD5, SHA-1 və ya salt-sız sürətli .
  • Kodda, image-də və ya repository-də hard-coded key-lər.
  • Söndürülmüş certificate validation və ya hər certificate-i qəbul edən custom trust manager.
  • Homegrown kriptoqrafiya: XOR "", öz protokolunuz, base64-ün kimi təqdim olunması.
  • Deprecated alqoritmlər və protokollar: DES, 3DES, RC4, SSL, 1.0, qısa RSA key-ləri.
  • Unauthenticated , ECB mode, sabit və ya təkrar istifadə olunan nonce/IV.
  • Qeyri-kriptoqrafik random ilə yaradılmış token və key-lər.
  • Rotate edilə bilməyən key-lər, çünki key versiyası heç yerdə saxlanmır.

Tapşırıqlar

  1. Sisteminizdəki ən sensitive üç data növünü seçin. Hər biri üçün yazın: harada saxlanılır, hansı səviyyədə encrypt olunur, key harada yaşayır və key-ə kim access edə bilər?
  2. Codebase-də verify=false, InsecureSkipVerify, MD5, SHA1, ECB və standart random funksiyalarını axtarın. Hər tapıntını təsnif edin: real risk və ya təhlükəsiz istifadə.
  3. Bir key-i rotate etməyi bu gün sınayın, staging-də. Köhnə data oxunurmu? Neçə addım əl ilə edildi və prosesi kim bilirdi?