Hash Fonksiyonları: Teoriden Gerçek Saldırılara

Hash fonksiyonu girdiyi sabit uzunlukta bir çıktıya çeviriyor ve geri dönüşü yok; MD5'ten bcrypt'e çığ etkisi, rainbow table ve salt gerçek saldırılarla anlatılıyor.

Hash fonksiyonunun mantığı basit. Fonksiyon girdiyi alıyor sabit uzunlukta bir çıktı üretiyor ve geriye dönüşü yok. “CWSpeciaL” yazıyorsun SHA-256 sana 64 karakterlik bir string döndürüyor ama o stringden “CWSpeciaL”e geri dönemiyorsun. Tabi ki teorik olarak.

Terminalimizi açıp şu komutları deneyelim:

echo -n "CWSpeciaL" | sha256sum

ad8b4978e1917914a098cdb111fb1da61c171c3a1cdfd63e8a3e8122af2917e6

Şimdi son harfi değiştirelim:

echo -n "CWSpecial" | sha256sum

586bfda1916a136380374be58b069ef57d2958b9fe3c6c430878f0530a205cb7

Tek karakter değiştirdik ve sonuç tamamen değişti. Çığ etkisi denilen şey işte budur ve tahmin edilebilirliği tamamen ortadan kaldırıyor.

Pratikte iş biraz daha karmaşık aslında.

MD5 mesela. Hala çoğu yerde karşılaşıyoruz.

echo -n "password" | md5sum
5f4dcc3b5aa765d61d8327deb882cf99

Bu hash değerini Google’da bile arattırdığınızda “password” çıktısı verdiğini göreceksiniz. MD5 için collision üretmek teorik olarak mümkün ama pratikte kimse yapamaz şeklinde akademik bir düşünce vardı ama artık saldırılarda kullanılıyor. SHA-1 de benzer. Google 2017’de SHAttered ile bunu gösterdi ve tarayıcılar SHA-1 sertifikaları artık reddediyor. Rainbow table tam burada devreye giriyor. Milyarlarca yaygın parolanın hashi önceden hesaplanıp tabloya alınıyor sen de hesaplanan hashten direkt eşleşme buluyorsun.

Hashcat yüklüyse şunu deneyebilirsiniz:

hashcat -m 0 5f4dcc3b5aa765d61d8327deb882cf99 /usr/share/wordlists/rockyou.txt
  • Filename..: /usr/share/wordlists/rockyou.txt
  • Passwords.: 14344392
  • Keyspace..: 14344385
  • Runtime…: 0 secs

5f4dcc3b5aa765d61d8327deb882cf99:password

Çözmesi 1 saniye bile sürmedi. Salt bunu kısmen çözüyor. Parolaya rastgele bir değer ekliyorsun hashlenmeden önce böylece aynı parola her kullanıcı için farklı bir hash üretiyor ve precomputed table işe yaramıyor.

kullanıcı1: password + salt “xK9mA”

echo -n "passwordxK9mA" | sha256sum

5bee3d4a8b09c6233e68af7f988c67f3d3765638a765ee7fda52b5d937d3fdb6

kullanıcı2: aynı parola + farklı salt “pQ2nZ”

echo -n "passwordpQ2nZ" | sha256sum

3a0d5656e70c29f1e9e587a17d1782ae1d38829dbd0795a5c81fc095e1e13688

Aynı parola iki farklı hash. Rainbow table bu noktada işe yaramıyor. Ama yine de SHA-256 + salt yeterince iyi sayılmıyor çünkü GPUlar bu konuda inanılmaz hızlı çalışıyor. bcrypt ya da Argon2 kasıtlı olarak yavaş tasarlanmış tam olarak bu yüzden.

bcrypt hash’i şöyle görünüyor:

$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/lewdBengvkqHkIR0K

$2b$ bcrypt versiyonu. $12$ cost factor. Bu değer ne kadar yüksekse hesaplama da o kadar yavaş. Saldırının süresi de artıyor.

Son olarak şunu ekleyeyim: encoding ile encryption’ı hash ile karıştırmamak gerekir. Hash tek yönlü. Bunlar birbirinin yerine geçmiyor.