Özet, şifreleme ve kodlama farkı
- Özet tek yönlüdür, şifreleme anahtarla geri döner, kodlama ise anahtarsız açılır; sızan bir dizenin hangi kutuya ait olduğunu ayırt edersin.
- SHA-256, AES ve Base64 örnekleriyle üç kutuyu birbirinden ayırırsın.
- Ders sonunda sızıntı dosyasındaki bir dizeye bakıp türünü ve işe yarayıp yaramadığını söylersin.
Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +50 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.
Altay Kargo'nun güvenlik ekibi, herkese açık bir depoda unutulmuş bir yapılandırma dosyası buldu. Dosyada üç uzun, anlamsız dize duruyor. Biri parola özeti, biri şifreli veri, sonuncusu da yalnız kodlanmış metin. Hangisinin hangisi olduğunu bilmezsen yanlış yola saatler harcarsın.
Kodlanmış dizeyi kırmaya uğraşırsın, oysa onu herkes saniyede okur. Özeti çözmeye çalışırsın, oysa özet çözülmez. Bu derste üç kutuyu ayırmayı öğrenirsin: özet, şifreleme ve kodlama.
Önce her birinin neden var olduğunu görürsün. Sonra komut satırında örnekleri çözer, bir dizenin türünü boyundan ve önekinden tanırsın. En sonda çakışmanın ve HMAC'in neden önemli olduğunu öğrenirsin.
Üç kutu: özet, şifreleme, kodlama
Özet fonksiyonu (hash) girdiyi alır ve sabit uzunlukta bir çıktı üretir. Bu çıktıya özet ya da parmak izi denir. SHA-256 her girdide 256 bit döner; ekranda bu değer 64 onaltılık karakter olarak görünür. Girdi tek harf de olsa, bin sayfalık kitap da olsa çıktının boyu değişmez.
NIST'in FIPS 180-4 standardı SHA-2 ailesini tanımlar ve özetin işini şöyle anlatır: mesajın, özet alındıktan sonra değişip değişmediğini yakalamak. Aynı girdi her zaman aynı özeti verir. Bu kararlılık sayesinde iki dosyayı baytlarını tek tek karşılaştırmadan, yalnız özetleriyle kıyaslarsın.
Özet tek yönlüdür. Çıktıdan girdiye giden bir hesap yolu yoktur, bu yüzden özeti çözemezsin. Elinden gelen tek şey tahmindir: aday girdinin özetini hesaplar, eldeki özetle karşılaştırırsın.
Tutarsa girdiyi bulmuşsundur. İnternetteki özet çözen siteler de aslında çözmez. Önceden hesaplanmış dev listelerde arama yaparlar ve yalnız listede olan girdiyi bulurlar.
Yaygın bir parolanın özeti bu yüzden saniyede eşleşir. Uzun ve rastgele bir dizenin özeti ise hiçbir listede çıkmaz. Özetin gücü, girdinin ne kadar tahmin edilemez olduğuna bağlıdır.
Şifreleme başka bir amaca hizmet eder: gizlilik. Veriyi anahtarla kilitler, doğru anahtarı bilen de kilidi açıp orijinal veriyi aynen geri alır. Geri dönüş tasarımın parçasıdır, çünkü alıcının mesajı okuması gerekir.
Şifreli çıktının boyu girdiyle birlikte büyür; 1 GB'lık dosyayı şifrelersen yaklaşık 1 GB'lık şifreli veri elde edersin. Özet ise hep aynı boyda kalır. Şifrelemede algoritma herkesçe bilinir, güvenlik yalnız anahtarın gizli kalmasına dayanır. AES ve RSA bu ailenin en tanınmış üyeleridir; aralarındaki farkı sonraki derste görürsün.
sha256("altay") = 9273141c...6c5ec416 (64 onaltılık karakter, geri dönmez)
sha256("altaz") = 34ca9724...80c418c7 (tek harf değişti, çıktı bambaşka)
aes_sifrele("altay", K) = <şifreli baytlar> (anahtarla kilitlendi)
aes_coz(<şifreli baytlar>, K) = "altay" (K elindeyse geri döner)
base64("altay") = YWx0YXk= (anahtar yok, herkes çözer)Kod bloğundaki ilk iki satıra bak. Girdiler yalnız son harfte ayrılıyor, özetler ise baştan sona farklı. Bu davranışa çığ etkisi denir.
Girdideki tek bit değişikliği, çıktı bitlerinin ortalama yarısını çevirir. Çığ etkisi olmasaydı benzer parolaların benzer özetlerinden yola çıkıp tahmini daraltabilirdin.
Üçüncü ve dördüncü satır şifrelemenin iki yönünü gösterir: K anahtarıyla kilitlenen veri yine K ile açılır. Son satırdaki Base64 çıktısı ise hiçbir anahtar kullanmadan üretildi. Onu gören herkes aynı işlemi tersine çevirir ve altay sözcüğüne ulaşır.
Etkinlik 1 / 7
Tek harflik metnin ve 4 GB'lık dosyanın SHA-256 özetini alıyorsun. Çıktıların boyu ne olur?
Önce kodu oku, sonra çıktıyı seç.
sha256("a")
sha256(altay-lab.iso) # 4 GBKodlama: taşıma biçimi, sır değil
Kodlama (encoding) üçüncü kutudur. Base64, ikili veriyi harf, rakam ve birkaç işaretten oluşan metne çevirir. Amaç, veriyi e-posta ya da HTTP gibi metin bekleyen kanallarda bozmadan taşımaktır.
Yöntem basittir. Girdi üçer baytlık gruplara ayrılır, her grubun 24 biti altışar bitlik dört parçaya bölünür.
Her parça 64 karakterlik alfabeden bir karaktere karşılık gelir. Bu yüzden Base64 çıktısı girdiden yaklaşık üçte bir daha uzundur. Kodlama anahtar istemez ve sır saklamaz. Algoritma herkesçe bilinir, dizeyi gören herkes onu saniyede geri çevirir.
Base64'ün tanıdık bir izi var. Çıktı dört karakterlik gruplar hâlinde ilerler. Girdi üç baytın katı değilse sona bir ya da iki eşittir işareti dolgu olarak eklenir. Alfabe büyük ve küçük harflerden, rakamlardan, artı ve eğik çizgiden oluşur.
Adreslerde kullanılan Base64URL türü artı yerine tire, eğik çizgi yerine alt çizgi koyar. RFC 4648 açıkça uyarır: kodlama parolayı gözden gizler ama hesaplama düzeyinde hiçbir gizlilik vermez. URL kodlaması ve onaltılık (hex) gösterim de aynı kutudadır. URL kodlaması boşluğu %20 biçimine çevirir, onaltılık gösterim her baytı iki karakterle yazar.
$ echo -n altay | base64 YWx0YXk= $ echo YWx0YXk= | base64 -d altay $ echo -n altay | xxd -p 616c746179 $ echo -n 'admin:Kargo2026' | base64 YWRtaW46S2FyZ28yMDI2
Çıktıyı satır satır oku. İlk komut beş baytlık altay sözcüğünü kodlar. Beş bayt üçün katı olmadığı için sonda tek bir eşittir dolgusu çıkar.
İkinci komut -d bayrağıyla işlemi tersine çevirir ve sözcüğü geri verir. echo komutundaki -n bayrağı, metnin sonuna satır sonu eklenmesini engeller; onu unutursan kodlanan veri, altay ile görünmez bir satır sonu olur.
Üçüncü komut her baytı iki onaltılık karakterle yazar: 61 a harfidir, 6c l harfidir. Son satır gerçek hayattan gelir. HTTP Basic kimlik doğrulaması kullanıcı adını ve parolayı iki nokta ile birleştirir, sonra Base64 ile kodlar. Bu başlığı düz HTTP üstünde yakalayan biri parolayı hemen okur.
Etkinlik 2 / 7
Yapılandırma dosyasının açıklama alanında bu dize duruyor. Çöz ve içindeki cümleyi yaz.
Araçları sırayla dene. Yanlış araç bozuk çıktı verir.
Dizeyi tanımak ve bütünlüğü doğrulamak
Sızıntıda gördüğün dizeyi önce boyundan ve önekinden tanırsın. Ham özetler onaltılık yazılır ve boyları algoritmayı ele verir. 32 karakter çoğunlukla MD5 ya da Windows'un NTLM özetidir.
40 karakter SHA-1, 64 karakter SHA-256, 128 karakter SHA-512 özetine işaret eder. Parola kayıtları ise çoğu zaman dolar işaretiyle başlayan bir önek taşır. $2b$ ya da $2y$ ile başlayan 60 karakterlik dize bcrypt kaydıdır.
$argon2id$ öneki Argon2id'yi gösterir. Linux'un /etc/shadow dosyasında $6$ öneki SHA-512 tabanlı crypt biçimini, $y$ öneki de yescrypt'i gösterir. Önekten sonraki alanlar ayarları ve tuzu taşır.
38b5822d72e9c9dba86f2f1955b76c6a 32 karakter: MD5 ya da NTLM 02ed469255d45c5eaf38390b8bb421cbc510f690 40 karakter: SHA-1 9273141c578a9fe3bdd3f2e3424241860fe777c55e6f7f3d923e914c6c5ec416 64 karakter: SHA-256 $2y$12$xjQfmjY7Q8o3INtfWyzgMeGtFBlc2ci8k8T4UqZLm.ggc8yPKQmom bcrypt, maliyet 12 $argon2id$v=19$m=19456,t=2,p=1$+pJ4gGYMuKT2syD6Rt3Uzw$47Sx0P... Argon2id YWx0YXk= Base64, özet değil
Etkinlik 3 / 7
Sızıntıdaki her dizeyi büyük olasılıkla ait olduğu türle eşleştir.
Özetin en yaygın işi bütünlük kontrolüdür. Diyelim ki bir Linux kalıp dosyası (ISO) indirdin. Yayıncı, sitesinde dosyanın SHA-256 değerini yayınlar.
Sen indirdiğin dosyanın özetini hesaplar ve iki değeri karşılaştırırsın. Değerler aynıysa dosya yolda değişmemiştir. Tek karakter bile farklıysa indirme bozulmuştur ya da dosyaya dokunulmuştur.
Linux'ta bu işi sha256sum komutu yapar, macOS'ta shasum -a 256. İkisi de dosyanın 64 karakterlik özetini ve adını basar. Yayıncılar çoğu zaman bütün dosyaların özetini SHA256SUMS adlı tek bir listede toplar. -c bayrağı bu listeyi okur ve karşılaştırmayı senin yerine yapar.
$ echo -n altay | sha256sum 9273141c578a9fe3bdd3f2e3424241860fe777c55e6f7f3d923e914c6c5ec416 - $ echo altay | sha256sum a46fa80da198a89d68ec7e3d3f9929efaca79a85165b69e32b9bcacd5ed0434c - $ sha256sum -c SHA256SUMS altay-lab.iso: OK $ sha256sum -c SHA256SUMS altay-lab.iso: FAILED sha256sum: WARNING: 1 computed checksum did NOT match
İlk iki komutun farkı tek bir bayrak. echo varsayılan olarak metnin sonuna satır sonu ekler. -n ile yalnız altay sözcüğünü, -n olmadan sözcükle birlikte satır sonunu özetlersin.
Çığ etkisi yüzünden iki çıktı tamamen ayrışır. Hesapladığın özet yayınlanan değerle tutmuyorsa önce bu görünmez karakteri düşün. Son iki komut aynı listeyi iki farklı anda denetler.
İlkinde dosya sağlam. İkincisinde dosyaya tek bir bayt eklenmiş ve komut FAILED yazmış. Komut bu durumda sıfırdan farklı bir çıkış kodu da döner. Kurulum betiklerinde bu denetimi bu yüzden otomatik bir kapı olarak kullanırsın: özet tutmazsa betik durur.
Etkinlik 4 / 7
Linux makinede indirdiğin altay-lab.iso dosyasının SHA-256 özetini hesapla.
Çakışma, HMAC ve özetin sınırları
İki farklı girdinin aynı özeti vermesine çakışma (collision) denir. Çıktı sabit boyda, girdi ise sınırsız olduğu için çakışmalar kuramsal olarak hep vardır. Sağlam bir özet fonksiyonunda onları bulmak pratikte imkânsızdır; SHA-256 için gereken iş yaklaşık 2 üzeri 128 işlemdir.
MD5 için araştırmacılar 2004'te gerçek çakışmalar üretti. SHA-1 için de 2017'de SHAttered adlı çalışma, aynı özeti veren iki farklı PDF dosyası yayımladı. NIST, SHA-1'i 2011'de kullanımdan düşürdü ve 2013 sonunda dijital imzada yasakladı. 2022'de de algoritmayı 2030 sonuna kadar bütünüyle emekliye ayıracağını duyurdu.
Çakışma kuramsal bir merak değildir. 2012'de ortaya çıkan bir casusluk yazılımı, MD5 çakışmasıyla geçerli görünen sahte bir kod imzalama sertifikası üretti. Hedef bilgisayarlar bu sertifikayla imzalanan zararlı güncellemeyi güvenilir saydı. Ders açıktır: imza ve bütünlük işinde zayıf özet, bütün güven zincirini zayıflatır.
Güvenlik kararı veren işte bugün SHA-256 ya da SHA-3 ailesini seçersin. MD5'i yalnız güvenlik gerektirmeyen işlerde, örneğin yinelenen dosyaları hızla bulmakta kullanırsın. Kod incelemesinde imza, sertifika ya da parola işinde MD5 veya SHA-1 görürsen bunu bulgu olarak yazarsın.
Etkinlik 5 / 7
Araştırmacılar aynı MD5 özetini veren iki farklı dosya üretti. Bu durumun adı ____.
Özetin bir sınırı daha var: kasıtlı değişikliği tek başına durdurmaz. Dosyayı değiştiren saldırgan yeni özeti de hesaplar ve yayınlanan değeri değiştirebilir. HMAC bu açığı kapatır.
Özeti gizli bir anahtarla birlikte hesaplar, anahtarı bilmeyen kişi de geçerli değer üretemez. Böylece HMAC hem bütünlüğü hem de mesajın kaynağını doğrular.
Gerçek hayatta en sık gördüğün yer webhook bildirimleridir. Ödeme ya da kargo sağlayıcısı, gönderdiği her bildirimin gövdesini ortak bir sırla HMAC'ten geçirir ve sonucu bir başlıkta yollar. Senin sunucun aynı hesabı yapar ve iki değeri karşılaştırır.
$ echo -n "tutar=500&siparis=8841" | openssl dgst -sha256 -hmac "webhook-sirri" SHA2-256(stdin)= 1cb51f26f249ecbeddf59a2d5744819f0b5c0db09b09c71196c02e4dcaae704b $ echo -n "tutar=5000&siparis=8841" | openssl dgst -sha256 -hmac "webhook-sirri" SHA2-256(stdin)= 1d32b3a992f5894a14b4c5183c478da880dedce2dd564baf8ae6454ea803597f
İki komut yalnız tutarda ayrılıyor: 500 yerine 5000. Bildirimi yolda değiştiren biri, sırrı bilmediği için yeni HMAC değerini üretemez. Sunucu gelen değerle kendi hesabını karşılaştırır, tutmayınca bildirimi reddeder. Karşılaştırmayı sabit sürede çalışan bir işlevle yaparsın, örneğin Python'da hmac modülünün compare_digest işleviyle.
Sıradan eşitlik denetimi ilk farklı karakterde durur ve geçen süre saldırgana ipucu verebilir. Sık görülen bir hata da sırrı ve mesajı yan yana koyup düz SHA-256 almaktır. Bu yapı HMAC'in kapattığı bir saldırıya açık kalır, bu yüzden dilin hazır HMAC işlevini kullanırsın.
Derinleş:SHA-256'nın iç yapısı ve uzunluk uzatma
SHA-256 mesajı 512 bitlik bloklara böler ve her bloğu 64 turluk bir sıkıştırma işlevinden geçirir. Her bloğun sonucu bir sonraki bloğun başlangıç durumu olur. Bu yapıya Merkle-Damgård yapısı denir. Son bloktan sonra kalan iç durum, özetin kendisidir.
Tasarımın ilginç bir yan etkisi var. sha256(sır + mesaj) değerini bilen biri, sırrı bilmeden mesajın sonuna ek yapıp yeni ve geçerli bir özet hesaplayabilir. Çünkü elindeki özet, hesabın kaldığı yerden sürmesi için gereken iç durumun ta kendisidir. Bu saldırının adı uzunluk uzatmadır (length extension).
HMAC anahtarı iki ayrı turda, içten ve dıştan kullanır ve bu yolu kapatır. SHA-3 ailesi sünger adlı farklı bir yapı kullanır ve bu saldırıdan etkilenmez. Pratik ders basit: anahtarlı özete ihtiyacın varsa düz birleştirme yerine HMAC kullanırsın.
Üç kutuyu amaçlarıyla hatırla. Şifrelemenin amacı gizliliktir: veriyi yalnız anahtar sahibi okur. Özetin amacı bütünlüktür: veride tek bir bit değişse fark edersin.
HMAC buna kaynak doğrulamayı ekler. Kodlamanın amacı ise taşımadır: veri, metin bekleyen bir kanaldan bozulmadan geçer. Yanlış kutuyu seçen tasarım ya sırrı açıkta bırakır ya da doğrulamayı kırar.
Bir tasarımı incelerken hep aynı soruyu sor. Bu veri gizli mi kalmalı, değişmediği mi kanıtlanmalı, yoksa yalnız taşınmalı mı? Cevap seni doğru kutuya götürür.
Etkinlik 6 / 7
Her tekniği amacına göre doğru kutuya at.
Önce bir seçeneğe, sonra aşağıdaki uygun kutuya bas. İstersen seçeneği kutuya sürükleyip bırak. Yerini değiştirmek için aynı işlemi tekrarla.
0/6 seçenek yerleşti.
Sahada: Base64 ile saklanan parola
Şimdi aynı ayrımı gerçek bir olayda dene. Bir geliştirici kullanıcı parolalarını veritabanına Base64 ile yazmış ve ekibe parolaları şifrelediğini söylemiş. Kodda tek bir satır duruyor: parola alanı kaydedilmeden önce base64 işlevinden geçiyor. Kodu gözden geçiren kişi çıktının anlamsız göründüğüne bakmış ve değişikliği onaylamış.
Aylar sonra bir yedek dosyası sızıyor. Parolanın doğru saklanışını modülün son dersinde göreceksin. Şimdilik bu kaydın saldırgana ne kadar iş çıkardığını düşün.
Bu hatayı erken yakalamanın yolları var. Kod incelemesinde parola alanına dokunan her işlevi ararsın. base64, hex, rot13 ya da ekibin kendi yazdığı bir karıştırma işlevi görürsen bulgu açarsın. Veritabanında parola sütunundan birkaç örnek alırsın.
Değerler eşittirle bitiyor ve boyları parolanın boyuyla birlikte değişiyorsa ortada kodlama vardır. Doğru bir parola kaydı hep aynı boydadır ve bir algoritma öneki taşır. Düzeltmede kodlamayı kaldırır, yavaş ve tuzlu bir parola özetine geçersin. Kayıtların sızmış olma ihtimali varsa bütün kullanıcılara parola sıfırlatırsın.
Etkinlik 7 / 7
Sızan tabloda parola sütunu WWF6MjAyNiE= gibi değerler taşıyor. Saldırgan parolaları nasıl elde eder?
Okumayı istediğin sırayla sürdürebilirsin. Ders, bütün etkinlikleri cevapladığında tamamlanır.
- Etkinlik 1· Üç kutu: özet, şifreleme, kodlama
- Etkinlik 2· Kodlama: taşıma biçimi, sır değil
- Etkinlik 3· Dizeyi tanımak ve bütünlüğü doğrulamak
- Etkinlik 4· Dizeyi tanımak ve bütünlüğü doğrulamak
- Etkinlik 5· Çakışma, HMAC ve özetin sınırları
- Etkinlik 6· Çakışma, HMAC ve özetin sınırları
- Etkinlik 7· Sahada: Base64 ile saklanan parola