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.