MD5 vs SHA-256 vs SHA-512 — Karma Fonksiyonları Açıklandı
Karma fonksiyonları yazılım geliştirmenin her yerindedir: dosya bütünlüğü kontrolleri, parola depolama, dijital imzalar, API kimlik doğrulaması, önbellek anahtarları, tekilleştirme. Yine de çoğu geliştirici onları kara kutu olarak çalıştırır — bir dizgi besler, sabit uzunluklu bir onaltılık özet geri alırsınız. Hangi karma fonksiyonunu kullanacağınızın ve hangisinden kaçınacağınızın ayrıntıları, çok önemli olmaktadır.
MD5 kırılmıştır. SHA-1 kullanımdan kaldırılmıştır. SHA-256 ve SHA-512 şu anda güvenlidir. Gelecek için güvence istiyorsanız SHA-3 vardır. Ancak "kırık" her bağlamda aynı anlama gelmez — MD5 bazı kullanım senaryoları için iyidir ve diğerleri için felaket niteliğinde yanlıştır. Bu kılavuz, önemli olan özellikleri, her fonksiyonun bunlara karşı nasıl durduğunu açıklar ve 2026'da doğru karma'yı seçmek için size net bir karar çerçevesi verir.
Bir Karma Fonksiyonunun Gerçekten Yaptığı
Bir kriptografik karma fonksiyonu, isteğe bağlı uzunlukta bir girdiyi sabit uzunluklu bir çıktıya (özet veya karma) eşler. Üç özellik kriptografik olarak güvenli bir karma fonksiyonunu tanımlar:
- Ön görüntü direnci — bir karma
hverildiğinde,hash(m) = holacak şekilde herhangi bir girdimbulmak hesaplama açısından uygulanamaz olmalıdır. Bu "tek yönlü" özelliktir. - İkinci ön görüntü direnci — bir girdi
m1verildiğinde,hash(m1) = hash(m2)olacak şekilde farklı bir girdim2bulmak uygulanamaz olmalıdır. - Çakışma direnci —
hash(m1) = hash(m2)olacak şekilde herhangi iki farklı girdim1vem2bulmak uygulanamaz olmalıdır.
Bu özelliklerin herhangi birini karşılamayan bir fonksiyon kriptografik kullanım için kırık kabul edilir. Burada "uygulanamaz"ın belirli bir anlamı olduğuna dikkat edin: matematiksel olarak imkânsız anlamına gelmez, mevcut veya öngörülebilir donanımla pratik olandan daha fazla hesaplama gerektirdiği anlamına gelir.
Ek olarak, kriptografik karma fonksiyonları çığ etkisi sergiler: girdideki tek bir biti değiştirmek, bitlerinin yaklaşık yarısında farklı olan bir çıktı üretir. Bu, benzer girdilerin tamamen farklı özetler üretmesini sağlar.
Girdi: "hello"
MD5: 5d41402abc4b2a76b9719d911017c592 (128 bit / 32 onaltılık karakter)
Girdi: "Hello"
MD5: 8b1a9953c4611296a827abf8c47804d7 (bir karakter değişikliği = tamamen farklı çıktı) MD5 — Hızlı, Yaygın ve Kırık
Tarih ve tasarım
MD5 (Mesaj Özeti 5), 1991'de Ron Rivest tarafından tasarlandı ve 128 bitlik (16 baytlık) bir özet üretir. 1990'ların çoğunda dosya bütünlüğü doğrulaması, sertifika imzalama ve parola karması için standart seçimdi. Son derece hızlıdır — modern bir CPU saniyede onlarca milyon MD5 karması hesaplayabilir ve bir GPU saniyede milyarlarca hesaplayabilir.
MD5 neden kırıktır
2004'te, Xiaoyun Wang ve meslektaşları MD5'e karşı pratik bir çakışma saldırısı gösterdiler — aynı MD5 karmasını üreten iki farklı dosya. Saldırı tüketici donanımında dakikalar içinde çalışır. 2008'de, araştırmacılar bir MD5 çakışması kullanarak sahte bir CA sertifikası oluşturdular ve gerçek dünya PKI altyapısının savunmasız olduğunu gösterdiler. 2012'ye gelindiğinde, Flame kötü amaçlı yazılımı bir Microsoft kod imzalama sertifikasını sahteleştirmek için bir MD5 çakışmasını kullandı.
NIST, çoğu kriptografik kullanım için MD5'i resmi olarak kullanımdan kaldırdı. Sertifika makamları 2009'da MD5 imzalı sertifika vermeyi durdurdular. Tarayıcı satıcıları 2011 civarında MD5 sertifika imzaları desteğini kaldırdılar.
MD5 hâlâ kabul edilebilir olduğunda
MD5 evrensel olarak işe yaramaz değildir. Güvenlik dışı sağlama toplamları için — dosya aktarımlarında kazara veri bozulmasını algılama, bir saldırganın girdileri etkileyemediği önbelleğe alma sisteminde içerik tabanlı adresleme veya kapalı bir dahili sistemde benzersiz tanımlayıcılar üretme — MD5 yeterli olmaya devam ediyor. Anahtar test: bir saldırgan bir çakışma oluşturmaktan yararlanabiliyorsa, MD5 kullanmayın. Yalnızca kazara bozulma önemliyse, MD5 iyidir.
- Güvenli: dahili tekilleştirme, önbellek anahtarları, güvenlik dışı dosya değişikliği algılama
- Güvensiz: sertifikalar, dijital imzalar, parola karması, dosya orijinallik doğrulaması, güvenlik belirteçleri
SHA-1 — Kullanımdan Kaldırılmış, Henüz Ölü Değil
SHA-1, 160 bitlik bir özet üretir ve MD5'in halefiydi. 2000'lerin çoğunda sertifika imzalama ve kod imzalama için standart olarak kaldı. 2017'de SHAttered saldırısı ilk pratik SHA-1 çakışmasını gösterdi ve yaklaşık 110 GPU-yıl hesaplama kullanarak özdeş SHA-1 karmalı iki farklı PDF dosyası üretti — pahalı ancak ulus devlet bütçelerinin içinde ve giderek daha erişilebilir.
SHA-1 NIST ve tüm büyük sertifika makamları tarafından kullanımdan kaldırılmıştır. Sertifikalar, kod imzalama veya herhangi bir yeni güvenlik açısından hassas uygulama için kullanılmamalıdır. Bazı eski sistemler hâlâ dahili olarak SHA-1 kullanıyor, ancak SHA-256'ya geçiş şiddetle önerilir. Git, nesne adreslemesi için hâlâ SHA-1 kullanır (SHA-256 geçişi devam ediyor olsa da), ancak bu aşamalı olarak kaldırılıyor.
SHA-256 — Mevcut Standart
SHA-256, NSA tarafından tasarlanan ve FIPS 180-4'te NIST tarafından standartlaştırılan SHA-2 ailesinin parçasıdır. 256 bitlik (32 baytlık) bir özet üretir. SHA-256, 2001'deki yayınından bu yana yoğun bir şekilde analiz edilmiştir ve hiçbir pratik saldırı bulunmamıştır. Şunlar için fiili standarttır:
- TLS sertifikaları (bugün verilen neredeyse tüm sertifikalar SHA-256 kullanır)
- Kod imzalama (Windows Authenticode, Apple notarization, JAR'lar)
- API kimlik doğrulaması için HMAC-SHA256 (AWS Signature v4, GitHub webhook doğrulaması)
- JWT belirteç imzaları (HS256 ve RS256 dahili olarak SHA-256 kullanır)
- Blockchain işlem ID'leri (Bitcoin çift SHA-256 kullanır)
- Paket yöneticilerinde dosya bütünlüğü doğrulaması (npm, pip, apt)
Girdi: "hello"
SHA-256: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
(256 bit / 64 onaltılık karakter)
SHA-512: 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d
99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
(512 bit / 128 onaltılık karakter) SHA-256'nın performansı
SHA-256 dahili olarak 32 bit sözcük işlemleri kullanır. Donanım hızlandırması olmayan 32 bit donanımda veya eski CPU'larda, MD5'ten fark edilir derecede daha yavaştır. SHA uzantıları olan modern 64 bit CPU'larda (Intel Goldmont+, AMD Zen+, Apple Silicon, ARM Cortex-A57+), SHA-256 donanım hızlandırmalıdır ve son derece hızlıdır — genellikle MD5 hızlarına yaklaşır. Çoğu sunucu ortamında donanım hızlandırması vardır, bu yüzden pratikte SHA-256 neredeyse tüm uygulamalar için yeterince hızlıdır.
SHA-512 — Daha Geniş, Bazen Daha Hızlı
SHA-512, dahili olarak 64 bit sözcük işlemleri kullanarak 512 bitlik (64 baytlık) bir özet üretir. SHA uzantıları olmayan 64 bit donanımda, SHA-512 aslında SHA-256'dan daha hızlı olabilir çünkü 64 bit işlemleri modern register genişliklerinden daha iyi yararlanır. SHA uzantıları olan donanımda, uzantılar özellikle SHA-256 için optimize edildiğinden SHA-256 tipik olarak daha hızlıdır.
SHA-512 daha büyük bir güvenlik marjı sağlar — SHA-256 için 128 bite karşı 256 bit çakışma direnci. Mevcut tehdit modellerinin çoğu için, SHA-256'nın 128 bit çakışma direnci fazlasıyla yeterlidir (kırmak yaklaşık 2^128 işlem gerektirir). SHA-512 şu durumlarda uygundur:
- 64 bit sunucuları hedefliyorsanız ve donanım uzantıları olmadan maksimum verim istiyorsanız
- Diğer kriptografik işlemler için anahtar materyal olarak daha uzun özetlere ihtiyacınız varsa
- Onlarca yıl korumalı kalması gereken veriler için ek güvenlik marjı istiyorsanız
- Özellikle SHA-512 gerektiren protokolleri uyguluyorsanız (örneğin, bazı TLS şifre paketleri)
SHA-384 ve SHA-512/256
SHA-384, 384 bit üreten SHA-512'nin kısaltılmış bir sürümüdür — SHA-512'nin 64 bit dahili işlemlerini istediğinizde ancak daha kısa çıktıya ihtiyacınız olduğunda kullanışlıdır. SHA-512/256, SHA-512'nin dahili hesaplamasını kullanarak 256 bit çıktı üreten başka bir kısaltılmış varyanttır. SHA-512/256, SHA-256'yı etkileyen uzunluk uzatma saldırılarına dirençlidir ve uzunluk uzatmasının bir endişe olduğu bağlamlarda kullanışlıdır (ancak HMAC bunu çoğu pratik senaryoda zaten azaltır).
SHA-3 — Farklı Mimari, Gelecek için Güvenli
SHA-3 (2015'te NIST FIPS 202'de standartlaştırıldı) Keccak süngeri yapısını kullanır — SHA-2'nin Merkle-Damgard yapısından temelden farklı bir tasarım. Bu önemlidir çünkü Merkle-Damgard tasarımında gelecekte keşfedilecek herhangi bir zayıflık MD5, SHA-1 ve SHA-2'yi aynı anda etkilerken, SHA-3 etkilenmemiş kalır.
SHA-3 şu anda güvenlidir ve uzun vadeli güvenceye ihtiyaç duyan veya gelecekteki SHA-2 zayıflıklarına karşı korunmak isteyen yeni sistemler için doğru seçimdir. Saf yazılım uygulamalarında SHA-256'dan daha yavaştır. SHA-3'ün parladığı yer donanım uygulamalarıdır — tasarımı silikonda çok verimlidir. SHA-3-256 ve SHA-3-512, SHA-2 karşılıkları ile aynı özet boyutlarını üretir.
Karşılaştırma Tablosu
| Algoritma | Çıktı | Çakışma Direnci | Durum | Hız (Yazılım) | Parolalar için? |
|---|---|---|---|---|---|
| MD5 | 128 bit | Kırık | Kullanımdan kaldırıldı | Çok hızlı | Asla |
| SHA-1 | 160 bit | Kırık | Kullanımdan kaldırıldı | Hızlı | Asla |
| SHA-256 | 256 bit | 128 bit | Mevcut standart | Hızlı (donanım hızl.) | Asla (çok hızlı) |
| SHA-512 | 512 bit | 256 bit | Güvenli | 64 bit'te hızlı | Asla (çok hızlı) |
| SHA-3-256 | 256 bit | 128 bit | Gelecek için güvenli | Orta (Yazılım) | Asla (çok hızlı) |
| bcrypt | 60 karakterli dizgi | Geçerli değil | Yalnızca parolalar | Kasıtlı olarak yavaş | Evet |
Parola Karması: Tamamen Farklı Bir Sorun
Bu, geliştiricilerin yaptığı en yaygın hatalardan biri olduğu için kendi bölümünü hak ediyor. SHA-256, dosya bütünlüğü kontrolleri, API imzalama ve sertifika doğrulaması için doğru araçtır. Parolaları karma yapmak için yanlış araçtır ve bu amaç için kullanmak gerçek güvenlik olaylarına neden olur.
Sorun hızdır. SHA-256 hızlı olacak şekilde tasarlanmıştır — modern bir GPU saniyede milyarlarca SHA-256 karması hesaplayabilir. Karma yapılmış parola veritabanınızı ele geçiren bir saldırgan saniyede milyarlarca parola tahmininde bulunabilir. Karma hızlıysa, uzun, rastgele bir parola bile hızla kırılabilir.
// Parolalar için ASLA bunu yapmayın
const hash = crypto.createHash('sha256').update(password).digest('hex'); // Parolalar için bcrypt, scrypt veya Argon2 kullanın
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash(password, 12); // maliyet faktörü 12 Bcrypt Test aracı tarayıcıda bcrypt parolalarını karma yapmanıza ve doğrulamanıza olanak tanır. Bcrypt maliyet faktörlerini ve hesaplama sürelerini anlamak için, uygulamanızın iş faktörünü yapılandırırken yararlı bir referanstır.
HMAC: Bir Karmaya Kimlik Doğrulama Ekleme
Düz bir karma onu kimin hesapladığı hakkında hiçbir şey kanıtlamaz — verisi olan herkes aynı SHA-256 karmasını hesaplayabilir. HMAC (Karma Tabanlı Mesaj Kimlik Doğrulama Kodu), hesaplamaya gizli bir anahtar ekler ve yalnızca anahtarı bilen biri tarafından üretilebilen bir etiket üretir. HMAC-SHA256 şunlar için standarttır:
- Webhook imza doğrulama (GitHub, Stripe, Shopify hepsi HMAC-SHA256 kullanır)
- AWS Signature Version 4 (istek imzalama)
- JWT HS256 belirteçleri (header + payload'un HMAC-SHA256'sı)
- Çerez bütünlüğü (kurcalamayı önlemek için oturum çerezlerini imzalama)
const crypto = require('crypto');
// HMAC-SHA256 ile bir mesajı imzala
const mac = crypto
.createHmac('sha256', secretKey)
.update(message)
.digest('hex');
// Doğrula: sabit zamanda karşılaştır (zamanlama saldırılarını önler)
const isValid = crypto.timingSafeEqual(
Buffer.from(mac, 'hex'),
Buffer.from(received, 'hex')
);
Karşılaştırma için timingSafeEqual kullanımına dikkat edin. MAC değerlerini normal bir dizgi eşitlik kontrolü ile karşılaştırmak, bir zamanlama saldırısında istismar edilebilecek zamanlama bilgilerini sızdırır. MAC'leri doğrularken her zaman sabit zamanlı bir karşılaştırma fonksiyonu kullanın. Kod yazmadan test ve hata ayıklama için HMAC-SHA256 değerlerini hesaplamak için HMAC Generator'ı kullanın.
Gerçek Dünya Önerileri
Genel dosya bütünlüğü (sağlama toplamları)
SHA-256 kullanın. Paket doğrulama için standarttır (npm kilit dosyaları, pip gereksinim karmaları, Docker imaj katmanları). SHA-256 Hash aracı, metin girişi veya dizgi değerleri için tarayıcınızda SHA-256 özetlerini hesaplar. Hızın kritik olduğu ve kaynağa güvendiğiniz hızlı güvenlik dışı sağlama toplamları için, MD5 kabul edilebilir olmaya devam ediyor ancak herhangi bir paylaşılan veya otomatik bağlamda SHA-256 tercih edilir.
TLS sertifikaları ve kod imzalama
SHA-256 gerekli standarttır. Tüm sertifika makamları SHA-256 sertifikaları verir. Yeni sertifikalar için MD5 veya SHA-1'i asla kullanmayın — modern tarayıcılar ve işletim sistemleri tarafından reddedilirler.
API kimlik doğrulaması
HMAC-SHA256 kullanın. Kurulu standarttır, tüm dillerde iyi desteklenir ve çoğu API güvenlik belgesi tarafından beklenen algoritmadır. Hızlı karşılaştırmalar için özetleri MD5 Hash aracı veya SHA-256 Hash aracı ile hesaplayın ve HMAC imzalarını HMAC Generator ile üretin.
Parola karması
Bcrypt (maliyet faktörü 12+), scrypt veya Argon2id kullanın. Tuzlamayla bile MD5, SHA-1, SHA-256 veya SHA-512'yi parolalar için doğrudan asla kullanmayın. Bcrypt Test aracı geliştirme sırasında bcrypt karmalarını doğrulamanıza yardımcı olabilir.
Onlarca yıl güvenlik gerektiren uzun ömürlü veriler
SHA-512 veya SHA-3-256'yı tercih edin. Daha büyük özet boyutu, kriptanalizdeki ilerlemelere karşı ek marj sağlar. NIST, uzun vadeli güvenlik gerektiren uygulamalar için SHA-512 ve SHA-3'ü önerir. SHA-2 algoritmalarının yetkili şartnamesi için NIST FIPS 180-4'teki resmi kılavuza bakın.
Eski kısıtlamaları olmayan yeni sistemler
Genel kullanım için SHA-256. Parolalar için Argon2id. Kimlik doğrulama kodları için HMAC-SHA256. Gelecek için güvence istiyorsanız ve biraz daha düşük performansı kabul edebiliyorsanız, genel amaçlı karma için SHA-3-256 SHA-256'ya sağlam bir alternatiftir.