Skip to content
Bloga Dönün
Eğitimler

MD5 vs SHA-256: Geliştirici Özet Algoritma Karşılaştırması

MD5, SHA-1, SHA-256 ve SHA-512'yi güvenlik, hız ve çıktı boyutu açısından karşılaştırın. Sağlama toplamı ve parola saklama için hangi özetin uygun olduğunu öğrenin.

12 dakika okuma

MD5 vs SHA-256: Hangi Özet Algoritmasını Kullanmalısınız?

Özetleme (hashing), bilgisayar biliminin en temel işlemlerinden biridir — ancak yanlış algoritmayı seçmek sisteminizi karma çarpışması saldırılarına, veri bozulmalarına veya gereksiz performans yüküne maruz bırakabilir. Bu kılavuz, en yaygın kullanılan dört özet algoritmasını karşılaştırır ve size net bir karar çerçevesi sunar.

Özet Fonksiyonu Nedir?

Kriptografik bir özet fonksiyonu, rastgele girdi verisini alır ve sabit boyutlu bir çıktı (özet değeri ya da “hash”) üretir. İyi özet fonksiyonlarının üç özelliği vardır:

  1. Belirleyici (deterministik): Aynı girdi her zaman aynı çıktıyı üretir.
  2. Tek yönlü: Özet değerinden orijinal girdiyi geri elde edemezsiniz; geri döndürülemez.
  3. Çarpışmaya dayanıklı: Aynı özet değerini üreten iki farklı girdiyi bulmak hesaplama açısından mümkün olmamalıdır.

Üçüncü özellik kırıldığında, algoritma “kriptografik olarak kırılmış” sayılır — MD5 ve SHA-1’in başına gelen tam olarak budur.

Algoritma Karşılaştırması Bir Bakışta

ÖzellikMD5SHA-1SHA-256SHA-512
Çıktı boyutu128 bit (32 hex karakter)160 bit (40 hex karakter)256 bit (64 hex karakter)512 bit (128 hex karakter)
Blok boyutu512 bit512 bit512 bit1024 bit
Tanıtım yılı1991199520012001
TasarımcıRon RivestNSA / NISTNSA / NISTNSA / NIST
Çarpışma direnciKırıldı (2004)Kırıldı (2017)GüvenliGüvenli
Hız (göreli)En hızlıHızlıOrtaOrta (64 bit’te daha hızlı)
NIST durumuKullanımdan kaldırıldıKullanımdan kaldırıldıÖnerilenÖnerilen

MD5: Hızlı ama Kırık

MD5 (Message-Digest Algorithm 5), 1991’de Ronald Rivest tarafından tasarlandı ve 1990’lar ile 2000’lerin başında sağlama toplamları için fiili standart hâline geldi. 32 onaltılık karakterden oluşan 128 bitlik bir özet değeri üretir.

MD5 Neden Kırılmış Sayılır

2004’te Xiaoyun Wang, MD5’e karşı pratik karma çarpışması saldırılarını ortaya koydu. 2008’e gelindiğinde araştırmacılar MD5 çarpışmalarını kullanarak sahte bir SSL sertifikası oluşturdu ve bu saldırının yalnızca teorik olmadığını kanıtladı. Günümüzde MD5 çarpışmaları, tüketici donanımında saniyeler içinde üretilebilir.

// Bir MD5 özet değeri üretin (yalnızca güvenlik dışı kullanım için)
// Web Crypto API MD5'i desteklemez — bir kütüphane kullanın
import { md5 } from 'hash-wasm';

const hash = await md5('Hello, World!');
console.log(hash);
// → 'bea8252ff4e80f41719ea13cdf007273' (32 hex karakter)

MD5’in Hâlâ Kabul Edilebilir Olduğu Durumlar

Kriptografik olarak kırılmış olmasına rağmen MD5, güvenlik dışı uygulamalarda hâlâ yararlıdır:

  • Dosya tekilleştirme: Depolama sistemlerinde yinelenen dosyaları tespit etme
  • Önbellek anahtarları: Önbellek aramaları için kısa, belirleyici anahtarlar üretme
  • Veri bütünlüğü sağlama toplamları: Verinin kazara bozulmadığının (kasıtlı olarak değiştirilmediğinin değil) hızlı doğrulanması
  • Eski sistem uyumluluğu: MD5 gerektiren eski sistemlerle birlikte çalışabilirlik

Temel nokta: MD5 kazara bozulmaya karşı koruma sağlar ancak kasıtlı manipülasyona karşı korumaz.

SHA-1: Kullanımdan Kaldırıldı ama Hâlâ Var

SHA-1 (Secure Hash Algorithm 1), NSA tarafından tasarlandı ve 1995’te NIST tarafından yayımlandı. 40 onaltılık karakterden oluşan 160 bitlik bir özet değeri üretir.

2017’de Google ve CWI Amsterdam, ilk pratik SHA-1 çarpışmasını (“SHAttered” saldırısı) ortaya koyarak aynı SHA-1 özet değerine sahip iki farklı PDF dosyası ürettiler. Büyük tarayıcılar ve sertifika otoriteleri zaten 2016 itibarıyla SHA-1 sertifikalarını reddetmeye başlamıştı.

SHA-1’i yalnızca onu zorunlu kılan sistemlerle uyumluluk için kullanın (örneğin Git, commit özetleri için SHA-1 kullanır, ancak SHA-256’ya geçiş yapmaktadır). Yeni geliştirmelerde SHA-256 veya daha güçlüsünü tercih edin.

SHA-256: Mevcut Standart

SHA-256, NSA tarafından tasarlanan ve 2001’de NIST tarafından yayımlanan SHA-2 ailesinin bir parçasıdır. 64 onaltılık karakterden oluşan 256 bitlik bir özet değeri üretir ve 2026 yılında neredeyse tüm özetleme ihtiyaçları için önerilen algoritmadır.

// Web Crypto API kullanarak bir SHA-256 özet değeri üretin (tarayıcıda yerleşik)
async function sha256(text) {
  const data = new TextEncoder().encode(text);
  const hash = await crypto.subtle.digest('SHA-256', data);
  return Array.from(new Uint8Array(hash))
    .map(b => b.toString(16).padStart(2, '0'))
    .join('');
}

const hash = await sha256('Hello, World!');
console.log(hash);
// → 'dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f'

SHA-256 Neden Varsayılan Tercihtir

  • Bilinen saldırı yok: 2026 itibarıyla SHA-256’ya karşı pratik bir çarpışma veya öngörüntü saldırısı bulunmamaktadır
  • Tarayıcıda yerleşik: Tüm modern tarayıcılarda Web Crypto API üzerinden kullanılabilir — kütüphaneye gerek yoktur
  • Endüstri standardı: TLS sertifikaları, Bitcoin, paket yöneticileri (npm, pip), Docker imaj özetleri ve çoğu bütünlük doğrulama sistemi tarafından kullanılır
  • NIST onaylı: Güvenlik açısından hassas tüm uygulamalar için önerilir

SHA-512: Daha Fazlasına İhtiyacınız Olduğunda

SHA-512, 128 onaltılık karakterden oluşan 512 bitlik bir özet değeri üretir. SHA-256’nın 512 bitine karşılık 1024 bitlik bir blok boyutu kullanır; bu da onu 64 bit işlemcilerde SHA-256’dan daha hızlı kılar çünkü çevrim başına daha fazla veri işler.

# Python: SHA-512 en az SHA-256 kadar kolaydır
import hashlib

hash_256 = hashlib.sha256(b'Hello, World!').hexdigest()
hash_512 = hashlib.sha512(b'Hello, World!').hexdigest()

print(f"SHA-256: {hash_256}")  # 64 karakter
print(f"SHA-512: {hash_512}")  # 128 karakter

SHA-512’yi şu durumlarda kullanın:

  • Daha geniş bir güvenlik payına ihtiyacınız var (SHA-256 için 128 bit’e karşı 256 bit çarpışma direnci)
  • Platformunuz 64 bit ve performans önemli (SHA-512, x86-64 üzerinde SHA-256’dan 1,5 kat daha hızlı olabilir)
  • Protokol veya teknik şartname bunu zorunlu kılıyor (bazı sertifika şemaları, belirli uyumluluk gereksinimleri)

Çoğu uygulama için SHA-256 yeterlidir. SHA-512 özetlerinin ek uzunluğu, tipik kullanım senaryolarında pratik bir güvenlik faydası sağlamadan depolama ve bant genişliğini iki katına çıkarır.

Karar Çerçevesi: Hangi Özeti Kullanmalı

Dosya bütünlüğü ve sağlama toplamları için

SHA-256 kullanın. İndirmeleri doğrulamak, dosya içeriklerini karşılaştırmak ve verinin bozulmadığından emin olmak için standarttır. Mevcut MD5 tabanlı bir sistemi değiştiriyorsanız, SHA-256 doğrudan yerine geçen bir yükseltmedir.

# Bir indirmenin bütünlüğünü doğrulayın
sha256sum downloaded-file.tar.gz
# Çıktıyı yayımlanan özet ile karşılaştırın

Parola saklama için

Ne MD5’i ne de SHA-256’yı doğrudan kullanın. Genel amaçlı özet fonksiyonları parola özetleme için fazla hızlıdır — bir saldırgan saniyede milyarlarca tahmin deneyebilir. Bunun yerine özel bir parola özetleme algoritması kullanın:

AlgoritmaDurumNotlar
Argon2idÖnerilen2015 Password Hashing Competition kazananı; bellek-yoğun
bcryptİyiGeniş destek; yerleşik salt; ayarlanabilir iş faktörü
scryptİyiBellek-yoğun; bazı kripto para sistemleri tarafından kullanılır
PBKDF2Kabul edilebilirNIST onaylı ancak bellek-yoğun değil; ≥600.000 iterasyon kullanın
SHA-256YetersizÇok hızlı; yerleşik salt yok; GPU saldırılarına karşı savunmasız
MD5TehlikeliKırık + çok hızlı; önemsiz biçimde kırılır
// YANLIŞ: Parolaları SHA-256 ile özetlemeyin
const hash = await sha256(password); // Saniyede milyarlarca tahminle kırılabilir

// DOĞRU: bcrypt kullanın (Node.js örneği)
import bcrypt from 'bcrypt';
const hash = await bcrypt.hash(password, 12); // 12 tur = ~250 ms
const isValid = await bcrypt.compare(input, hash);

HMAC ve mesaj kimlik doğrulaması için

HMAC ile birlikte SHA-256 kullanın. HMAC (Hash-based Message Authentication Code), hem bütünlüğü hem de gerçekliği doğrulamak için bir özet fonksiyonunu gizli bir anahtarla birleştirir:

// Webhook imza doğrulaması için HMAC-SHA256
async function verifyWebhook(payload, signature, secret) {
  const key = await crypto.subtle.importKey(
    'raw', new TextEncoder().encode(secret),
    { name: 'HMAC', hash: 'SHA-256' }, false, ['verify']
  );
  const sig = Uint8Array.from(atob(signature), c => c.charCodeAt(0));
  return crypto.subtle.verify('HMAC', key, sig, new TextEncoder().encode(payload));
}

İçerik adresli depolama için

SHA-256 kullanın. Git, Docker ve IPFS, içeriğin özet değerinin onun adresi olarak hizmet verdiği içerik adresli depolama kullanır. SHA-256, milyarlarca nesne arasında benzersizliği garanti etmek için yeterli çarpışma direnci sağlar.

Performans Karşılaştırmaları

Modern bir x86-64 işlemcide göreli özetleme hızı (yüksek = daha hızlı):

AlgoritmaVerim (MB/s)Göreli Hız
MD5~3.2001,0x (taban)
SHA-1~2.4000,75x
SHA-256~1.5000,47x
SHA-512~2.1000,66x

Not: SHA-512, daha geniş dahili durumu nedeniyle 64 bit işlemcilerde SHA-256’dan daha hızlıdır. 32 bit sistemlerde durum tersine döner. Çoğu uygulama için hız farkı önemsizdir — bu algoritmaların herhangi biriyle 1 MB’lık bir dosyayı özetlemek 1 ms’den az sürer.

Kaçınılması Gereken Yaygın Hatalar

1. MD5’i güvenlik için kullanmak

MD5 çarpışmalarını üretmek son derece kolaydır. MD5’i dijital imzalarda, sertifika doğrulamasında veya bir saldırganın kötü niyetli girdi oluşturabileceği herhangi bir senaryoda asla kullanmayın.

2. Parolaları SHA-256 ile özetlemek

SHA-256 bir parola özeti değildir. Çok hızlıdır, yerleşik salt’ı yoktur ve rainbow table ile GPU hızlandırmalı kaba kuvvet saldırılarına karşı savunmasızdır. Argon2id veya bcrypt kullanın — yerleşik salt ve ayarlanabilir iş faktörü ile birlikte gelirler.

3. Özet uzunluğunun güvenliğe eşit olduğunu varsaymak

512 bitlik bir özet, çarpışma direnci açısından otomatik olarak 256 bitlik bir özetten “daha güvenli” değildir. SHA-256’nın güvenlik payı (128 bit çarpışma direnci) zaten kaba kuvvet kapasitesinin çok ötesindedir. Özet uzunluğuna göre değil, gerçek gereksinimlerinize göre seçim yapın.

4. Kendi özet kombinasyonlarınızı kurgulamak

SHA256(MD5(data)) veya MD5(data + salt) gibi desenler, kırık bir algoritmayı sihirli biçimde düzeltmez. Bunun yerine tek, iyi denetlenmiş bir algoritma (SHA-256) veya doğru bir yapı (HMAC) kullanın.

Kendiniz Deneyin

Özet Üretici ile MD5, SHA-1, SHA-256 ve SHA-512 özetlerini anında üretin ve karşılaştırın — metin yapıştırın ya da bir dosya bırakın, dört özeti yan yana görün. Her şey %100 tarayıcınızda olur, hiçbir veri cihazınızdan ayrılmaz.

Kimlik doğrulama akışlarına daha geniş bir bakış için JWT çözme rehberimize bakın — token bütünlüğü ve signature doğrulamayı ele alır. Kodlama tarafında ise Base64 ileri düzey rehberimiz MIME, data URL ve performans tuzaklarını derinlemesine işler.

Sıkça Sorulan Sorular

MD5 sağlama toplamları için hâlâ güvenli mi?

MD5, kazara dosya bozulmasını tespit etmek için güvenlidir — bir dosya indirme sırasında zarar görürse, MD5 özet değeri neredeyse kesinlikle değişecektir. Ancak MD5, kasıtlı kurcalamaya karşı güvenli değildir çünkü bir saldırgan aynı MD5 özet değerine sahip değiştirilmiş bir dosya oluşturabilir. Saldırganların endişe konusu olduğu bütünlük doğrulamalarında (örneğin yazılım dağıtımı), bunun yerine SHA-256 kullanın.

SHA-256, MD5’e kıyasla ne kadar daha yavaştır?

SHA-256, ham verim açısından MD5’ten kabaca 2 kat daha yavaştır. Modern donanımda MD5 saniyede yaklaşık 3.200 MB özetlerken SHA-256 saniyede yaklaşık 1.500 MB özetler. Pratikte bu fark çoğu uygulama için ihmal edilebilir düzeydedir — 100 MB’lık bir dosyayı SHA-256 ile özetlemek yaklaşık 70 ms sürer. Performans farkı yalnızca ağ paket denetimi veya geniş ölçekte depolama tekilleştirme gibi çok yüksek verimli senaryolarda önem kazanır.

Uygulamam için SHA-256 mı SHA-512 mi kullanmalıyım?

Çoğu uygulama için SHA-256’yı kullanın — 128 bit çarpışma direnci sağlar ki bu kaba kuvvet kapasitesinin çok ötesindedir. SHA-512’yi şu durumlarda tercih edin: (a) platformunuz 64 bit ve maksimum verime ihtiyacınız var, (b) bir teknik şartname veya uyumluluk gereksinimi bunu zorunlu kılıyor ya da (c) uzun vadeli veri bütünlüğü için daha geniş bir güvenlik payı istiyorsunuz. SHA-512’nin ek özet uzunluğu depolamayı iki katına çıkarır ve nadiren gereklidir.

SHA-256 kırılabilir veya geri çevrilebilir mi?

SHA-256 geri döndürülemez — tek yönlü bir fonksiyondur. 2026 itibarıyla SHA-256’ya karşı pratik bir öngörüntü veya çarpışma saldırısı bulunmamaktadır. Bilinen en iyi saldırı, çarpışmalar için 2^128 işlem gerektirir; bu da mevcut veya öngörülebilir teknolojiyle hesaplama açısından mümkün değildir. SHA-256, NIST tarafından onaylanmıştır ve TLS, Bitcoin ile federal sistemler dâhil kritik altyapıda kullanılır.

MD5 kırıldıysa neden bazı sistemler hâlâ kullanıyor?

Eski sistemlerle uyumluluk başlıca nedendir. Pek çok mevcut sistem, protokol ve dosya biçimi, MD5’in zayıflıkları keşfedilmeden önce onun etrafında tasarlandı. Bunlardan uzaklaşmak, tüm bileşenler arasında koordineli değişiklikler gerektirir. Önbellek anahtarları ve tekilleştirme gibi güvenlik dışı kullanımlarda, karma çarpışması saldırılarının bir tehdit modeli endişesi olmadığı yerlerde MD5’in hız avantajı ve daha kısa çıktısı onu pragmatik bir tercih kılar.