Kriptografinin İsviçre Çakısı: Özet (Hash) Fonksiyonlar
Geçtiğimiz aylarda çoğumuzun bildiği bir yemek sipariş uygulamasının veri tabanı sızdırılmıştı. Şirketin açıkladığına göre parolalarla ilgili bir problem yoktu çünkü Sha-256 ile ile hashlenmişti. Çoğumuz hash alma işlemini yüzeysel olarak biliyoruz. Bu yazıda biraz daha derinine inelim ve bakalım neden özet fonksiyonlara kriptografinin İsviçre çakısı deniyor, şirketin iddia ettiği gibi parolalarımız güvende mi görelim.
Özet fonksiyonlar dijital imza, mesaj doğrulama kodları, rastgele sayı üreteçleri, anahtar üretme fonksiyonları vs birçok yerde kullanılıyor. Tabiri caizse her işimizi hallediyor.
Hayal edelim. Bulut sistemlerinde, veya sistemlerimizde bir film ya da kitap bulunsun. Aynı filmi ya da kitabı tekrar yüklemek ve ya indirmek istediğimizde sistem, bu dosya zaten var diye uyarı veriyor. Her defasında filmi açıp bakması demek ciddi bir zaman ve kaynak israfı olurdu. Bunun yerine filmin belli bir uzunlukta özeti olsa, sistem özetleri alarak karşılaştırma yapsa ne güzel olurdu, değil mi? Evet güzel olurdu, zaten özet fonksiyonlar da tam olarak bu işi yapıyor. Büyüklüğü ne olursa olsun, girdiyi bir fonksiyona sokuyor ve sabit uzunluklu bir çıktı veriyor. Parolalarımızı sisteme kaydederken bu fonksiyona sokuyor ve veri tabanında bu halini tutuyor. Sisteme giriş yaparken parolamı yazıyorum, yazdığım parolanın hashi alınıyor ve sistemdekiyle kontrol ediliyor. Eğer aynılarsa sisteme girebiliyorum. Bu yüzden giriş ekranında parolamı unuttum diye tıkladığınızda mail adresinize parolanızın kendisi gelmiyor, parola değiştirme linki geliyor, çünkü parolanızı sistem de bilmiyor. Tabi, parolayı da gönderebilirler ama bu durumda o sistemi ya hiç kullanmamalı ya da mecbursanız, kişisel verilerinizi kesinlikle paylaşmamalısınız, çünkü sistem yöneticileri güvenlikten bihaberdirler.
Peki bir saldırgan farklı bir parola girerse ve bu parolanın hashi ile veri tabanında kayıtlı olan hash aynı olursa ne olur? Benzer şekilde veri tabanı sızdırılırsa saldırgan bu hashlenmiş parolalardan benim parolamı elde edebilir mi? Cevap; etmemesini bekleriz, çünkü farklı uzunluklarda girdiler var ve çok büyük bir girdi uzayı vardır ama sadece belli uzunlukta çıktılardan oluşan çıktı uzayı vardır, bu da sistemde zorunlu bir açık yaratıyor. Kritoptografik özel fonksiyonları bu riski minimize edecek şekilde tasarlanır. Bir özet fonksiyonda temelde 3 özelliğin olmasını bekleriz.
- Ön görüntü dayanıklılığı (Preimage resistance)
- İkinci ön görüntü dayanıklılığı ( Second preimage resistance)
- Çakışma dayanıklılığı( Collision resistance)
Ayrıca çıktının da rastgele bitlerden oluşmuş olması beklenir.
Şimdi detaylıca açıklayalım, neymiş bu özellikler:
Ön Görüntü Dayanıklılığı( Preimage Resistance)
h bir hash fonksiyonu olsun. x benim yemeksepeti parolam olsun. Yemeksepeti sisteminde benim parolamı n uzunluklu y dizisi olarak tutacaktır.
h(x)=y, |y|=n
Azıcık matematiksel ifade ettim, ama korkmayın, çok uzun tutmayacağım.
Benim parolam “yemek” olsun.
x=”yemek”
Sistemde parolam aşağıdaki şekilde tutulacak:
y=93F612D096FA3FF80E5CA43D51C6AB4249B045E1A672E509E18D02F0EC12BF88
Şimdi, saldırgan y’yi ele geçirmişse, elinde herhangi başka bir veri olmadan x’e yani “yemek” parolasına erişmesi mümkün olmamalı.
Bir kaba kuvvet saldırısı için 2^n kadar süre gereklidir. Bu da çıktının uzunluğunun en az 128 bit olmasını gerektirir.
İkinci Ön Görüntü Dayanıklılığı(Second Preimage Resistance)
Bir h(x)=y, hash fonksiyonunda
h(x1)=y1 eşitliğini sağlayan x1 girdisi verildiğinde h(x2)=y1 eşitliğini sağlayan x2 girdisini bulmak zor olmalıdır.
Az önce de yazdığım gibi girdi uzayı çok büyük ama çıktı uzayı sınırlı. Bu yüzden muhakkak böyle x1 ve x2'ler olacaktır. İşte bunları bulmanın zor olmasına ikinci ön görüntü dayanıklılığı(second preimage resistance) denir.
Eğer sistemin ikinci ön görüntü dayanıklılığı yoksa, bir saldırganın benim buluta yüklediğim verinin hashi ile kendi kötü yazılımının hashi aynı olabilir ve saldırgan sistemi kandırabilir, bu teorik olarak mümkündür.
Çakışma Dayananıklılığı(Collision resistance)
h(x1)=h(x2)=y sonucunu verecek x1 ve x2'leri bulmak zor olmalıdır. İkinci ön görüntü dayanıklılığında saldırganın elinde x1'in bilgisi varken x2'yi bulmaya çalışıyordu, farkı hatırlamış olalım.
Şimdi de bazı hash fonksiyon örneklerine bakalım. Geçmeden önce blok şifrelerin de özet fonksiyon üretiminde kullanılabileceğini belirtmekte fayda var.
MD4, MD5, SHA1, SHA2 olmak üzere SHA3'e kadar olan tüm özet fonksiyonları Merkle-Damgard yöntemiyle oluşturulmuştur.
Buna göre mesaj bloklara bölünür, gerekirse dolgu eklenir. Ardından her blok f ile işleme sokulur.
MD4
1990 yılında Ronald Rivest tarafından tasarlanmıştır.
- Blok uzunluğu: 512 bit
- Özet uzunluğu: 128 bit
- Döngü sayısı: 48
- Tür: Merkle-damgard
- Aşağıdaki şekilde A,B,C,D 32 bitlik durum değerleridir, Mi ise mesaj parçalarıdır.
Yukarıdaki resimde “<<<” 3 kere sola kaydır demektir. Aradaki işlemler XoR, bitwise toplama ve çarpma olabilmektedir.
MD4 2014'e kadar kullanılmıştır ama bugün kullanılmıyor. Çakışma dayanıklılığı(Collision resistance) mikrosaniyelere kadar inmiştir.
Artık kullanılmıyor ama MD5 ve SHA1'e ilham olmuştur.
f fonksiyonu ise bir takım mantıksal ve, veya, XoR işlemlerinden oluşmaktadır.
MD5
MD4 dayanıksız olduğu için biraz daha geliştirilerek elde edilmiştir. Mesela f yerine F,G,H,I kullanılmıştır.
F(B,C,D)=(B^C)V(B`^D)
G(B,C,D)=(B^C) v(C^D`)
H(B,C,D)=BoCoD
I(B,C,D)=Co(BvD`)
olacak şekilde tanımlanmıştır.
Burada her 16 döngü fonksiyonu olarak F,G,H ve I kullanılmıştır.
Fonksiyonlara ek olarak döngü sayısı 48'den 64'e yükseltilmiştir.
Buna rağmen çakışma üretmek 1 saniyeden daha kısa süre alır.
- 2004: Aynı MD5 özeti verecek iki farklı dosyanın olabileceği gösterilmiştir.
- 2008'de sahte SSL sertifikası oluşturmanın mümkün olduğu gösterilmiş, sertifika otoritelerinin MD5 kullanmayı bırakmaları tavsiye edilmiştir.
- 2012'de Flame zararlı yazılımı MD5 çakımalarını kullanarak sahte Windows kod imzalama sertifikası kullanmıştır.
Bugün çok kolay çakışma bulunabildiği için kullanılmamaktadır. Olur da bir bulut hizmetinde kullanılırsa, farklı dosyaların özeti aynı olacağı için sistem çökecektir.
SHA-1
MD4 ve MD5'in aksine akademisyenler değil, Amerikan istihbarat birimi NSA tarafından tasarlanmıştır.
- Blok uzunluğu:512 bit
- Özet uzunluğu: 160 bit
- Döngü sayısı:80
- Tür: Merkle-Damgard
Bu kez MD4'te bir döngüdeki basamaklar artırılmış, MD4'deki A,B,C,D durum değerlerine 1 tane daha eklenmiş 160 bitlik çıktı üretilmiştir.
2017 yılında ekran kartlarıyla yapılan bir çalışmada çakışma olduğu gösterilmiştir.
SHA-2
SHA-1 gibi NSA tarafından tasarlanmıştır. Özet uzunluğu artırılmıştır. Bu da özel uzayını artıracağı için çakışma ihtimalini oldukça zayıflatmıştır.
- Blok uzunluğu: 512 veya 1024 bit
- Özet Uzunluğu: 224, 256, 384 veya 512 bit
- Döngü Sayısı: 64 veya 80
- Tür: Merkle-Damgard
Resimde de görüleceği üzere ara basamaklardaki işlemler artırılmış, daha da karmaşık bir hale gelmiştir. Ancak MD4,MD5, SHA-1 ile benzer bir yapıya sahip olduğu için, henüz kırılamamış da olsa, yeni bir hash algoritmasına ihtiyacımız var.
Elimizdeki kırılamayan tek algoritma kaldığı için NIST 2017 yılında SHA-3 için bir yarışma düzenledi. 64 katılımcıdan 4'ü Türktü. “Özgül Küçük”ün “Hamsi” isimli algoritması da finale kalmış ama ataklara dirençli olduğu halde yavaş olduğu için kazanamamıştır. Yarışmayı “Keccak” algoritması kazandı, ve SHA-3 olarak bu algoritmaya karar verildi.
SHA-3 (Keccak)
- Blok Uzunluğu: 1152, 1088, 832, 576 bit
- Özet Uzunluğu: 224, 256, 384 veya 512 bit
- Döngü Sayısı: 64 veya 80
- Tür: Sünger
Şu ana kadar MD4, MD5, SHA1 kırılmıştır. Bu yüzden henüz çalışan bir saldırı olmadığı için SHA2, ve SHA3 kullanılmalıdır. Yine de bir listeyi ele geçiren saldırgan kullanıcı bilgilerini sözlük saldırısı gibi yöntemlerle ele geçirebilir. Ama burada kırılamamıştırdan kasıt tümüyle kırılamamış demektir.
Olası hash saldırılarını yazımı daha fazla uzatmamak için başka bir yazımda paylaşacağım. Yazımda Cihangir Tezcan’ın youtube ders ve videolarından faydalandım.