Hash üreteci
Herhangi bir metnin MD5 ve SHA hash'lerini üretin ve bir değeri beklenen bir sağlama toplamıyla karşılaştırın.
Bir hash işlevi gerçekte ne yapar
Bir kriptografik hash işlevi, herhangi bir boyuttaki bir girdiyi alır ve sabit uzunlukta bir bayt dizesi üretir — bir özet ya da «hash». Ona tek bir harf ya da bütün bir roman verin, MD5 her zaman 16 bayt, SHA-256 her zaman 32 bayt döndürür. Aynı girdi her zaman aynı özeti üretir ve girdinin herhangi bir yerindeki tek bir biti değiştirmek çıktının bitlerinin yaklaşık yarısını değiştirir; neredeyse aynı iki dosyanın tümüyle ilgisiz hash'lere sahip olmasının nedeni budur.
Kritik özellik, işlevin yalnızca tek yönde çalışmasıdır. Bir dosyanın hash'ini hesaplamak hızlıdır; dosyayı hash'inden geri elde etmek yalnızca yavaş değil, ilkesel olarak imkânsızdır, çünkü sabit uzunluktaki bir çıktı sınırsız bir girdiyi kodlayamaz. Bir hash bir parmak izidir, şifreli bir kopya değil — çözülecek hiçbir şey yoktur.
İnsanların hash'leri gerçekte ne için kullandığı
- İndirmeleri doğrulama: bir proje bir sürümün SHA-256'sını yayımlar, siz aldığınız dosyayı hash'lersiniz ve eşleşen özetler, baytların bozulmadan geldiği anlamına gelir.
- Değişikliği algılama: sürüm denetimi, yedekleme ve yinelenenleri kaldırma sistemleri, tüm dosyalar yerine hash'leri karşılaştırır, çünkü 32 baytı karşılaştırmak gigabaytları karşılaştırmaktan çok daha ucuzdur.
- Alt Kaynak Bütünlüğü (Subresource Integrity): bir web sayfası, bir CDN'den yüklediği bir betiğin Base64 hash'ini sabitler ve dosya eşleşmezse tarayıcı onu çalıştırmayı reddeder.
- Parolaları saklama — ama düz bir hash ile değil, özel amaçlı yavaş bir işlevle. Aşağıya bakın.
Bunların ortak yanına dikkat edin: hash, daha büyük bir şeyin kompakt bir vekilidir; şeyin kendisini iletmeden ya da saklamadan «bu, beklediğimle aynı şey mi?» sorusuna yanıt vermek için kullanılır.
MD5 ve SHA-1 bozuk — bunun pratikte anlamı
Bir hash işlevi, birileri bir çakışma oluşturabildiği anda bozuk sayılır: aynı özeti üreten iki farklı girdi. MD5 çakışmaları 2004'ten beri sıradan donanımda hesaplanabilir ve 2017'de SHAttered saldırısı, aynı SHA-1 hash'ine sahip iki farklı PDF dosyası üretti. Her iki algoritma da bu nedenle bu araçta işaretlidir.
Pratik sonuç «asla kullanmayın»dan daha dardır. Bir çakışma, her iki dosyayı da denetleyen bir saldırganın kötü niyetli birini iyi huylu birinin özetiyle eşleştirebileceği anlamına gelir; bu yüzden MD5 ve SHA-1 artık bir dosyanın düşman biri tarafından değiştirilmediğini kanıtlayamaz. Kazara bozulmayı — kesik bir indirme, bir diskte çevrilmiş bir bit — algılamak için hâlâ kusursuzca işe yararlar ve onları eski sistemlerde, ETag başlıklarında ve yeniden yazılmayacak eski paket manifestlerinde görmeye devam edeceksiniz.
Başparmak kuralı: soru «bu, aktarımda hasar gördü mü?» ise MD5 uygundur. Soru «birileri bunu bilerek değiştirdi mi?» ise SHA-256 ya da daha iyisini kullanın.
Bir parolayı bunlarla asla hash'lemeyin
MD5, SHA-1 ve hatta SHA-256 hızlı olacak şekilde tasarlanmıştır ve hız, parolaları saklamak için tam olarak yanlış özelliktir. Modern bir GPU saniyede milyarlarca SHA-256 hash'i hesaplar; bu yüzden düz hash'lenmiş parolalardan oluşan çalınmış bir veritabanı devasa ölçekte saldırıya uğrayabilir — ve aynı parola her zaman aynı özeti ürettiği için, önceden hesaplanmış tablolar bunu daha da ucuzlatır.
Parola saklama, bilerek yavaş, tuzlanmış (salt), belleğe dayanan bir işlev gerektirir: Argon2id, scrypt ya da bcrypt. Her parolaya benzersiz bir rastgele tuz eklerler; böylece aynı parolalar bir özeti paylaşmaz ve ayarlanabilir biçimde pahalıdırlar; böylece her tahmin bir saldırgana gerçek zaman ve bellek maliyeti getirir. Bu araç sağlama toplamları ve parmak izleri içindir, parola hash'leme için değil.
Özetleri okuma ve karşılaştırma
Aynı özet birden çok şekilde yazılabilir. Küçük harfli on altılık, standart komut satırı araçlarının yazdırdığı şeydir ve genellikle karşılaştıracağınız şeydir:
md5sum file.iso # Linux sha256sum file.iso # Linux shasum -a 256 file.iso # macOS Get-FileHash file.iso -Algorithm SHA256 # PowerShell (prints uppercase) certutil -hashfile file.iso SHA256 # Windows (prints uppercase)
Hex büyük/küçük harf hiçbir anlam taşımaz — PowerShell ve certutil büyük harf, Unix araçları küçük harf yazdırır ve ikisi aynı değerdir. Bu araçtaki karşılaştırma kutusu bu nedenle hex büyük/küçük harfini yok sayar. Base64 farklı bir konudur: aynı baytların daha yoğun bir kodlamasıdır, Alt Kaynak Bütünlüğü ve çeşitli API'ler tarafından kullanılır ve orada büyük/küçük harf önemlidir; bu yüzden tam olarak karşılaştırılır.
Edinmeye değer son bir alışkanlık: iki uzun özetin eşleşip eşleşmediğine karar vermek için asla gözle bakmayın. İnsan gözü beklediğini görmekte çok iyidir ve ilk ve son birkaç karakterin uyuşması hiçbir şey ifade etmez. Beklenen değeri yapıştırın ve karşılaştırmanın tam olmasına izin verin.
Sıkça sorulan sorular
- Metnim bir sunucuya gönderiliyor mu?
- Hayır. Her özet tarayıcınızda hesaplanır — SHA ailesi Web Crypto API üzerinden ve MD5, kendi makinenizde çalışan JavaScript üzerinden. Yazdığınız hiçbir şey cihazınızdan çıkmaz.
- Bir hash, özgün metni geri almak için tersine çevrilebilir mi?
- Hayır. Bir hash, sabit uzunlukta bir parmak izidir, şifreli bir kopya değil ve özgünü ondan geri elde edilemez. «MD5 şifre çözme» diye reklam yapan siteler, hash'inizi önceden hesaplanmış yaygın girdilerden oluşan bir tabloda arar; bu yalnızca kısa ya da tahmin edilebilir metin için işe yarar.
- MD5 ve SHA-1 burada neden bir uyarı taşıyor?
- Çünkü her ikisinde de çakışmalar pratik olarak mümkündür: bir özeti paylaşacak iki farklı girdi oluşturulabilir. Bu, onları bir dosyanın bilerek değiştirilmediğini kanıtlamak için uygunsuz kılar, ama kazara bozulmayı yakalamak için hâlâ uygundurlar.
- Hangi algoritmayı kullanmalıyım?
- SHA-256 mantıklı varsayılandır ve çoğu projenin bugün yayımladığı şeydir. SHA-512 bu amaç için anlamlı biçimde daha güvenli değildir, ama 64 bitlik donanımda daha hızlıdır. MD5 ya da SHA-1'i yalnızca denetlemediğiniz bir şey onları zaten gerektiriyorsa kullanın.
- Bununla bir parola hash'leyebilir miyim?
- Yapabilirsiniz, ama sonucu saklamamalısınız. Parola saklama, Argon2id, scrypt ya da bcrypt gibi yavaş, tuzlanmış bir işlev gerektirir — bunlar gibi hızlı hash'ler, çalınmış parola veritabanlarının kırılmasını kolaylaştıran şeyin ta kendisidir.
- Bir boşluk ya da satır sonu eklediğimde hash'ler neden değişiyor?
- Çünkü boşluk girdinin bir parçasıdır. Sondaki bir satır sonu, bir hash'in beklediğinizle eşleşmemesinin en yaygın tek nedenidir — bir terminalden ya da bir düzenleyiciden kopyalanan metin çoğu zaman göremediğiniz bir tane taşır.
- İbranice, Arapça ve emojiyi doğru işler mi?
- Evet. Metin, hash'lemeden önce UTF-8 baytları olarak kodlanır; bu, diğer her aracın kullandığı standarttır; böylece burada «שלום» ya da bir emoji hash'lemek, aynı karakterleri içeren bir UTF-8 dosyasında md5sum ya da sha256sum ile aynı özeti verir.
- Neden metni hash'liyor ama dosyaları değil?
- Web Crypto'nun akışlı bir özet API'si yoktur; bu yüzden bir dosyanın hash'lenebilmesi için önce tümüyle belleğe okunması gerekir ve elle yazılmış MD5 büyük bir dosyada belirgin biçimde yavaş olurdu. Metin hash'leme, sayfayı takan bir dosya hash'leme sunmak yerine yaygın durumu dürüstçe karşılar.