Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 37

Yetersiz Entropi Belirleme

Recommended resources

Önceki dersimizde, dinamik tipli dillerde veri tiplerinin manipüle edilerek güvenlik kontrollerinin nasıl aşılabileceğini inceledik. Bir verinin tipini zorlamanın, kimlik doğrulama gibi kritik mantık akışlarını nasıl atlatabileceğini gördük. Bu dersle birlikte, kriptografik implementasyonlardaki yaygın hataları ele alacağımız yeni bir modüle başlıyoruz. Bu modülün ilk adımında, verinin kalitesine, daha doğrusu tahmin edilemezliğine odaklanacağız.

Bu dersin sonunda, güvenlik açısından kritik olan token, nonce ve salt gibi değerlerin üretiminde kullanılan rastgele sayıların kalitesini nasıl değerlendireceğini ve yetersiz entropi kaynaklı zafiyetleri kod seviyesinde nasıl tespit edeceğini öğreneceksin. Unutma, Robert R. Coveyou'nun dediği gibi, "Rastgele sayı üretimi şansa bırakılamayacak kadar önemlidir."

Güvenliğin Temeli: Tahmin Edilemezlik

Kriptografik sistemlerin güvenliği, temelinde tek bir varsayıma dayanır: Saldırganın, anahtarlar veya token'lar gibi gizli değerleri kaba kuvvet saldırısı dışında bir yöntemle tahmin edememesi. Bu değerlerin üretildiği rastgele sayı üreteci (RNG) zayıfsa, yani tahmin edilebilir çıktılar üretiyorsa, sistemin en sağlam şifreleme algoritması bile anlamsız hale gelir.

Bu görsel, yetersiz entropiye sahip bir rastgele sayı üretecinin (RNG) doğasını özetliyor. Üretecin çıktısı, sınırlı bir sayı havuzundan geldiği için belirli değerler tekrar eder ve bir desen ortaya çıkar. Bu öngörülebilirlik, kriptografik güvenlik için kabul edilemez bir risktir.

Kod denetimi perspektifinden bakıldığında, rastgele sayı üreteçlerini üç ana kategoriye ayırabiliriz:

  1. Sözde Rastgele Sayı Üreteçleri (Pseudo-Random Number Generators - PRNG): Bunlar, bir başlangıç değeri (seed) alıp deterministik bir algoritma kullanarak rastgele görünen bir sayı dizisi üreten fonksiyonlardır. Aynı seed ile her zaman aynı sayı dizisini üretirler. Hızlı ve tekrarlanabilir olmaları, onları simülasyonlar ve oyunlar için ideal kılar, ancak güvenlik için kesinlikle uygun değildir.
  2. Gerçek Rastgele Sayı Üreteçleri (True-Random Number Generators - TRNG): Bu üreteçler, entropi kaynağı olarak klavye/fare hareketleri, ağ paket zamanlamaları veya atmosferik gürültü gibi fiziksel ve tahmin edilemez olayları kullanır. Çıktıları deterministik değildir ve kriptografik açıdan en güvenli rastgelelik kaynağıdır. İşletim sistemleri genellikle /dev/random (Linux) gibi aygıtlar aracılığıyla bu tür bir entropi havuzu sunar.
  3. Kriptografik Olarak Güvenli Sözde Rastgele Sayı Üreteçleri (Cryptographically Secure Pseudo-Random Number Generators - CSPRNG): Bunlar, PRNG'lerin hızını TRNG'lerin güvenlik garantileriyle birleştiren özel üreteçlerdir. Yüksek entropili bir kaynaktan (genellikle işletim sisteminin TRNG'si) aldıkları seed ile başlarlar ve çıktıları, bir sonraki bitin tahmin edilmesini istatistiksel olarak imkansız kılacak şekilde tasarlanmıştır. Modern kriptografik uygulamaların neredeyse tamamı CSPRNG kullanır.

Aşağıdaki şema, bir CSPRNG ile standart bir PRNG arasındaki temel felsefe ve kullanım alanı farklarını net bir şekilde ortaya koymaktadır.

Bu karşılaştırma, iki üreteç tipi arasındaki en kritik farkları vurgular. CSPRNG, "sonraki bitin tahmin edilemezliği" (next-bit unpredictability) garantisi verir, yüksek entropili bir seed kullanır ve kriptografik anahtarlar gibi hassas veriler için tasarlanmıştır. PRNG ise hızlı ve tekrarlanabilirdir, genellikle basit bir seed (zaman damgası gibi) kullanır ve oyunlar gibi güvenlik dışı alanlarda tercih edilir.

Bu ayrımı daha derinlemesine anlamak için şimdi bir başlangıç kaynağı olan "RASTGELE SAYILAR ÜZERİNE" başlıklı makaleyi inceleyelim.

RASTGELE SAYILAR ÜZERİNE - HATSAT

Bu makale, konunun temelini ve pratikteki önemini anlamak için mükemmel bir başlangıç noktasıdır. Kriptografide rastgeleliğin neden kritik olduğunu, PRNG ve TRNG arasındaki farkları ve bu farkların güvenlik üzerindeki etkilerini gerçek dünya örnekleriyle açıklıyor.

Lütfen aşağıdaki bölümlere odaklanarak makaleyi oku: Giriş ve Kullanım Alanları: Bu bölümü okuyarak rastgeleliğin kriptografideki rolünü ve C dilindeki klasik srand(time(0)) hatasının neden bir güvenlik felaketi olduğunu anla. Rastgele Sayı Üreteçleri ve PRNG: Bu kısım, bilgisayarların neden doğal olarak rastgele sayı üretemediğini ve PRNG'lerin temel çalışma prensibini açıklıyor. PRNG Detayları: Bu bölüm, seed (tohum) kavramının PRNG'ler için neden merkezi olduğunu ve aynı seed ile aynı dizinin üretildiğini vurguluyor. TRNG Detayları: Bu bölümü okuyarak TRNG'lerin entropiyi nasıl fiziksel dünyadan topladığını ve neden daha güvenli ama daha yavaş olduklarını anla. Karşılaştırma Tablosu: Bu tablolara göz atarak PRNG ve TRNG arasındaki temel farkları (efektiflik, determinizm, periyodiklik) ve hangi uygulamanın hangisini gerektirdiğini pekiştir.


Entropi: Tahmin Edilemezliğin Matematiksel Ölçüsü

Matematik altyapın sayesinde, "entropi" kavramının sadece soyut bir fikir olmadığını, aynı zamanda nicel bir ölçüt olduğunu takdir edeceksin. Bilgi teorisinde Claude Shannon tarafından tanımlanan entropi, bir rastgele değişkenin belirsizlik seviyesini ölçer. Kriptografik bağlamda, bir anahtarın, token'ın veya nonce'un entropisi, bir saldırganın onu tahmin etmek için denemesi gereken ortalama deneme sayısıyla doğrudan ilişkilidir.

Matematiksel olarak Shannon Entropisi şu formülle ifade edilir:

Burada , sonucunun gerçekleşme olasılığıdır.

Bu formülün pratik anlamı şudur:

  • Bir bitin '0' veya '1' gelme olasılığı eşitse (yani ), entropi 1'dir. Bu maksimum belirsizlik durumudur.
  • Eğer bir bit her zaman '1' geliyorsa (), entropi 0'dır. Hiç belirsizlik yoktur.

Yetersiz entropi, rastgele sayı üretecinin çıktılarının olasılık dağılımının düzgün olmadığı anlamına gelir. Bazı çıktılar diğerlerinden daha olasıdır, bu da entropiyi düşürür ve saldırganın arama uzayını (search space) daraltır.

Kriptografik rasgele sayı üreteçleri için temel gereksinimler, "Kriptografide Rasgelelik Kavramı" başlıklı akademik makalede çok net bir şekilde özetlenmiştir.

Kriptografide Rasgelelik Kavramı ve Gerçek Rasgele Sayı ...

Bu makale, konuyu daha teorik ve derinlemesine bir çerçeveye oturtuyor. Özellikle entropi ve kriptografik gereksinimler hakkındaki tanımları, bir kod denetçisinin "neden" sorusuna cevap bulması için çok değerlidir.

Makalede, "Gerçek Rasgelelik Kavramı" başlığı altındaki bölümü okuyarak kriptografinin öngörülemezlik tanımını anla. Ardından, entropinin matematiksel tanımını ve yüksek entropinin neden tahmin edilemezliği garanti ettiğini incele. Son olarak, Tablo 1'deki <span data-type="resource_reading_textrange" data-resource-subitem-id="a78b0e61" data-range-start="Kriptografik RSÜ’ ler için temel değerlendirme kriteri" data-range-end="kusursuz bir RSÜ metodolojisi yoktur">R1, R2, R3 ve R4 gereksinimlerini dikkatlice oku. Bu gereksinimler, bir RNG'yi denetlerken zihninde olması gereken kontrol listesidir. Özellikle R2 gereksinimi ("öncül ve ardıl sayıların tahmin edilememesi") CSPRNG'lerin temel vaadidir.


Gerçek Dünya Felaketleri: Entropi Eksik Olduğunda

Teorik açıklamalar önemlidir, ancak yetersiz entropinin yol açtığı gerçek dünya zafiyetleri konunun ciddiyetini en iyi şekilde gösterir.

1. Debian OpenSSL Zafiyeti (2006-2008)
Bu, tarihteki en kötü şöhretli kriptografik hatalardan biridir. Bir Debian geliştiricisi, Valgrind gibi bir kod analiz aracının verdiği "initialize edilmemiş bellek kullanımı" uyarısını "düzeltmek" için, OpenSSL'in rastgele sayı üretecini besleyen kritik bir kod satırını yorum satırı haline getirdi. Bu tek satırlık değişiklik, entropi havuzuna giren veri miktarını büyük ölçüde azalttı. Sonuç olarak, SSL/TLS anahtarları, SSH anahtarları ve diğer tüm kriptografik materyaller, sadece proses ID'si (PID) gibi çok sınırlı bir entropi kaynağı ile (yaklaşık 16 bit) üretilmeye başlandı. Bu, 2^16 = 65,536 olası anahtar anlamına geliyordu ve bir saldırganın bu anahtarları dakikalar içinde deneyerek özel anahtarları bulmasını sağladı. İki yıl boyunca milyonlarca sunucu bu zafiyetten etkilendi.

"RASTGELE SAYILAR ÜZERİNE" makalesi bu olayı detaylıca anlatmaktadır.

RASTGELE SAYILAR ÜZERİNE - HATSAT

Bu zafiyet, entropinin önemini anlamak için ders niteliğindedir.

Makaledeki "Debian Linux dağıtımı" ile başlayan bölümü dikkatle oku. Bir geliştiricinin iyi niyetli ama hatalı bir değişikliğinin nasıl bir kriptografik felakete yol açtığını gör.

2. Hacker News Hacklenmesi
Bu vaka, zayıf seed seçiminin doğrudan sonucudur. Hacker News platformu, kullanıcıların oturum ID'lerini (session ID) üretmek için bir PRNG kullanıyordu. Bu PRNG'nin tohumu (seed) ise, uygulamanın başlangıç zamanının milisaniye cinsinden değeriydi. Bir saldırgan, sunucunun çökmesini sağlayıp yeniden başlama zamanını yaklaşık olarak tahmin ederek, olası seed değer aralığını (örneğin 60 saniye = 60,000 milisaniye) büyük ölçüde daralttı. Bu dar aralıktaki tüm olası oturum ID'lerini önceden hesaplayarak diğer kullanıcıların hesaplarını ele geçirmeyi başardı.

Bu vaka da aynı makalede mükemmel bir şekilde açıklanmıştır.

RASTGELE SAYILAR ÜZERİNE - HATSAT

Bu örnek, zayıf seed'lemenin pratik sonucunu gösteriyor.

Lütfen makaledeki "Hackernews Hacklenmesi" bölümünü incele. Seed olarak zaman damgası kullanmanın neden tehlikeli olduğunu bu örnekle somutlaştır.


Kod Denetimi: Anti-Desenleri Tespit Etmek

Bir kod denetçisi olarak görevin, bu tür zayıf rastgele sayı üreteçlerinin kullanımını tespit etmektir. İşte dil bazında araman gereken anti-desenler:

Kural: Kriptografik amaçlar (anahtar, token, IV, nonce, salt, parola sıfırlama kodu vb.) için ASLA standart bir PRNG kullanma.

Python

  • ❌ YANLIŞ (PRNG): random modülü. random.random(), random.randint(), random.choice() gibi fonksiyonlar Mersenne Twister algoritmasını kullanır. Bu algoritma istatistiksel testler için harikadır ancak kriptografik olarak güvenli değildir. Durumu (state) bilindiğinde sonraki sayılar tahmin edilebilir.
    import random
    
    
    
    
    # Anti-desen: Parola sıfırlama token'ı için güvenli DEĞİL!
    reset_token = random.randint(100000, 999999) 
    
  • ✅ DOĞRU (CSPRNG): secrets modülü (Python 3.6+). Bu modül, özellikle kriptografik kullanımlar için tasarlanmıştır. Arka planda işletim sisteminin en güvenilir entropi kaynağını (os.urandom) kullanır.
    import secrets
    
    
    
    
    # Doğru kullanım: Kriptografik olarak güvenli token üretimi
    secure_token = secrets.token_hex(16) # 32 karakterlik güvenli bir onaltılık token üretir
    
  • ✅ DOĞRU (CSPRNG): os.urandom(n). Bu, işletim sisteminin kriptografik olarak güvenli kabul edilen entropi havuzundan n baytlık rastgele veri çeker. secrets modülü de temel olarak bunu kullanır.

"RASTGELE SAYILAR ÜZERİNE" makalesindeki uygulama bölümü, random ile os.urandom arasındaki farkı NIST testleriyle kanıtlamaktadır.

RASTGELE SAYILAR ÜZERİNE - HATSAT

Bu pratik test, teoriyi somut kanıtlarla destekler.

Makalenin sonundaki "Uygulama" bölümünü incele. Python'un random fonksiyonu ile üretilen sayıların testleri geçemediğini, ancak /dev/urandom (yani os.urandom) kaynağından gelen sayıların başarılı olduğunu gör.

JavaScript (Node.js)

  • ❌ YANLIŞ (PRNG): Math.random(). Bu fonksiyon, spesifikasyon gereği kriptografik olarak güvenli değildir. Tarayıcı ve Node.js implementasyonları (örneğin, xorshift128+) tahmin edilebilir olabilir ve asla güvenlik amacıyla kullanılmamalıdır.
    // Anti-desen: Güvenli DEĞİL!
    const insecureToken = Math.random().toString(36).substring(2);
    
  • ✅ DOĞRU (CSPRNG): crypto modülü. Node.js'in yerleşik crypto modülü, işletim sisteminin OpenSSL gibi kütüphaneleri aracılığıyla sağladığı CSPRNG'ye erişim sunar.
    const crypto = require('crypto');
    
    // Doğru kullanım: Kriptografik olarak güvenli bayt üretimi
    const secureBytes = crypto.randomBytes(16);
    const secureToken = secureBytes.toString('hex'); // 32 karakterlik güvenli bir onaltılık token
    

Kod tabanında bu anti-desenleri bulmak için Math.random, random.randint gibi anahtar kelimelerle arama yapabilir ve bu fonksiyonların çıktılarının güvenlik açısından kritik bir "sink"e (örneğin, bir token oluşturucu, IV, salt) ulaşıp ulaşmadığını takip edebilirsin.


Sonuç

Bu derste, kriptografik güvenliğin temel taşlarından biri olan tahmin edilemezliğin önemini ve bunun yeterli entropi ile nasıl sağlandığını öğrendik. Rastgele sayı üreteçleri arasındaki kritik farkları ve yanlış üreteç seçiminin yol açabileceği yıkıcı sonuçları gerçek dünya örnekleriyle gördük.

Anahtar Çıkarımlar:

  • Üç Tür RNG: Simülasyonlar için PRNG, kriptografi için CSPRNG ve entropi kaynağı olarak TRNG arasındaki ayrım kritiktir.
  • Entropi Her Şeydir: Bir kriptografik değerin güvenliği, entropi miktarıyla doğru orantılıdır. Yetersiz entropi, saldırganın tahmin etme olasılığını artırır.
  • Seed'in Önemi: PRNG'lerin güvenliği tamamen seed'in gizliliğine ve tahmin edilemezliğine bağlıdır. Zaman damgası gibi tahmin edilebilir seed'ler, sistemi savunmasız bırakır.
  • Kod Denetim Stratejisi: Math.random (JS) veya random modülü (Python) gibi standart, kriptografik olmayan kütüphanelerin; token, salt, nonce veya anahtar üretiminde kullanılıp kullanılmadığını kontrol et. Bunların yerine daima crypto (JS) veya secrets (Python) gibi CSPRNG sağlayan kütüphaneler kullanılmalıdır.

Artık kriptografik olarak güvenli ve tahmin edilemez değerleri nasıl üreteceğimizi biliyoruz. Ancak bu değerleri güvenli bir şekilde üretmek, denklemin sadece bir yarısıdır. Bir sonraki dersimizde, bu değerleri güvenli bir şekilde karşılaştırmanın ne kadar önemli olduğunu göreceğiz. Zamanlama yan kanalı (timing side-channel) zafiyetlerini ve parola gibi hassas verileri karşılaştırırken sabit zamanlı (constant-time) algoritmaların neden zorunlu olduğunu inceleyeceğiz.