Reklam Alanı
Yazılım Geliştirme
Yazılım Geliştirme

Şifre Saklama: Neden MD5 Değil, Neden bcrypt/Argon2

22 Ağustos 2026 · 3 dk okuma · 23 okunma

Parola saklama konusundaki en yaygın ve en tehlikeli yanlış anlama, "hashleme" ile "güvenli parola hashleme"nin aynı şey olduğu varsayımıdır. MD5, SHA-1 hatta çıplak SHA-256 gibi kriptografik özet fonksiyonları parola saklamak için tasarlanmamıştır; çünkü bu algoritmaların temel tasarım amacı hızdır, güvenlik açısından ise tam tersi istenir.

MD5 Neden Yetersiz Kalıyor

MD5, saniyede milyarlarca özet hesaplayabilen modern GPU'larda son derece hızlı çalışır. Bu hız, dosya bütünlüğü doğrulaması gibi senaryolarda avantajken parola saklamada felakete dönüşür: bir saldırgan çalınan bir veritabanı üzerinde brute-force veya rainbow table saldırısıyla milyonlarca parolayı saatler içinde deneyebilir. Ayrıca MD5'in bilinen collision (çakışma) zafiyetleri, kriptografik olarak da güvenilirliğini yitirmesine yol açmıştır. Salt eklenmeden kullanılan MD5, aynı parolaya sahip kullanıcıların aynı hash değerine sahip olmasına, dolayısıyla önceden hesaplanmış rainbow table'larla kolayca kırılmasına izin verir.

Doğru Yaklaşım: Kasıtlı Olarak Yavaş Algoritmalar

bcrypt (1999, Niels Provos ve David Mazières) ve Argon2 (2015 Password Hashing Competition kazananı) gibi algoritmalar, bilinçli olarak yavaş ve kaynak yoğun tasarlanmıştır; bu sayede saldırganın deneme-yanılma maliyeti katbekat artar, meşru kullanıcı için giriş süresi ise fark edilmez düzeyde kalır (genelde <100ms).

PHP'de bcrypt kullanımı şu şekildedir:

$hash = password_hash($plainPassword, PASSWORD_BCRYPT, ['cost' => 12]);
// Doğrulama:
if (password_verify($plainPassword, $hash)) {
    // giriş başarılı
}

Buradaki cost parametresi (genellikle 10-14 aralığında) her artışta hesaplama süresini yaklaşık iki katına çıkarır (2^cost round). Sunucu donanımı güçlendikçe cost değeri artırılarak saldırganın maliyeti sabit tutulabilir; bu "adaptif maliyet" ilkesidir.

Argon2: Bellek de Bir Direnç Katmanı

Argon2 bir adım daha ileri giderek yalnızca CPU zamanını değil, bellek tüketimini de saldırı maliyetine dahil eder; bu, GPU/ASIC tabanlı paralel saldırıları özellikle zorlaştırır çünkü bu donanımlarda bellek bant genişliği kısıtlıdır.

$hash = password_hash($plainPassword, PASSWORD_ARGON2ID, [
    'memory_cost' => 65536, // KiB cinsinden bellek (64 MB)
    'time_cost'   => 4,     // iterasyon sayısı
    'threads'     => 2,     // paralellik derecesi
]);

memory_cost parametresini yüksek tutmak, saldırganın aynı anda paralel çalıştırabileceği deneme sayısını doğrudan sınırlar; time_cost her denemenin süresini uzatır; threads ise sunucu tarafında hesaplamayı hızlandırmak için kullanılan iş parçacığı sayısıdır ve saldırgan tarafında paralellik avantajını azaltmak üzere dengelenmelidir.

Salt: Her Zaman Otomatik ve Benzersiz

Hem bcrypt hem Argon2, PHP'nin password_hash() fonksiyonunda her çağrıda otomatik olarak rastgele ve benzersiz bir salt üretir; bu salt hash çıktısının içine gömülür, ayrıca saklanmasına gerek yoktur. Bu sayede aynı parolayı kullanan iki kullanıcı bile farklı hash değerlerine sahip olur ve rainbow table saldırıları anlamsızlaşır.

Parola hashleme algoritması seçerken soru "ne kadar hızlı" değil, "saldırgan için ne kadar pahalı" olmalıdır.

Özetle: MD5 ve benzeri hızlı özet fonksiyonları parola saklamak için asla kullanılmamalı; bunun yerine bcrypt veya tercihen Argon2id, uygun cost/memory/time parametreleriyle yapılandırılarak kullanılmalıdır. Altyapı güvenliği ile ilgili diğer konular için Siber Güvenlik kategorisine göz atabilirsiniz.

İlgili Yazılar