Hash Nedir?

Makale

Bir hash (veya hash özeti), bir hash fonksiyonu tarafından herhangi bir boyuttaki giriş verisinden üretilen sabit boyutlu bir dizedir. Hash fonksiyonları tek yönlü matematiksel fonksiyonlardır — herhangi bir girdi verildiğinde hash'ini anında hesaplayabilirsiniz, ancak orijinal veriyi kurtarmak için işlemi tersine çeviremezsiniz. Aynı girdi her zaman aynı çıktıyı üretir ve tek bir karakter değişikliği bile tamamen farklı bir sonuca yol açar.

Bir dize veya dosya için hash hesaplamak ister misiniz?

Hash Üreteci'ni Aç →

Tarihçe

Hash fonksiyonları kökenlerini 1953 yılına dayandırır; IBM'de Hans Peter Luhn, veri erişimi için en erken hashing kavramlarından birini tanımlamıştır. Kriptografik hashing, 1970'lerde açık anahtar kriptografisiyle birlikte resmi bir disiplin olarak ortaya çıktı. Önemli kilometre taşları şunlardır: MD5 (1991, Ron Rivest), SHA-1 standardı (1995, NSA/NIST) ve SHA-256 ile SHA-512'yi tanıtan SHA-2 ailesi (2001, NSA/NIST). 2012'de NIST, tamamen farklı bir iç yapıya sahip alternatif olarak SHA-3'ü (Keccak) standartlaştırdı. Şifre hashing için bcrypt (1999, Niels Provos & David Mazières) kasıtlı yavaşlık kavramını getirdi ve Argon2, 2015'te Şifre Hashing Yarışması'nı kazanarak GPU saldırılarına karşı bellek sertliği ekledi.

Hashing Nasıl Çalışır?

Bir hash fonksiyonu, herhangi bir uzunluktaki girdiyi alır ve sabit uzunluklu bir çıktı (özet) üretir. Kriptografik bir hash fonksiyonunu dört temel özellik tanımlar:

SHA-256("hello")  = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-256("Hello")  = 185f8db32921bd46d35b97f9c798b7d00b6c5fb5f0c2c3f0c3f2f1e2d1c0b9a8
SHA-256("")       = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Hash Algoritmaları

MD5

Ron Rivest tarafından 1991'de tasarlanmıştır. 128-bit (32 hex karakter) özet üretir. MD5 kriptografik olarak kırılmıştır — 2004'ten bu yana pratik çarpışma saldırıları gösterilmiş ve 2008'de MD5 çarpışmaları kullanılarak sahte bir SSL sertifikası oluşturulmuştur. Güvenlik amaçlarıyla hiçbir zaman kullanılmamalıdır. Güvenlik dışı checksum'lar için hâlâ kabul edilebilirdir (örneğin, bir dosya indirmesinin iletim hataları nedeniyle bozulmadığını doğrulamak için, değil manipülasyon).

MD5("hello") = 5d41402abc4b2a76b9719d911017c592

SHA-1

NIST tarafından 1995'te yayımlanmıştır. 160-bit (40 hex karakter) özet üretir. SHA-1, tüm güvenlik kullanımları için kullanımdan kaldırılmıştır — Google, 2017'de pratik bir çarpışma saldırısı (SHAttered) göstermiştir. Tarayıcılar ve sertifika yetkilileri SHA-1 sertifikalarını kabul etmeyi bırakmıştır. Git, tarihsel olarak nesne kimlikleri için SHA-1 kullanıyordu (şimdi SHA-256'ya geçiyor).

SHA-1("hello") = aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d

SHA-2 (SHA-256, SHA-512)

NIST tarafından 2001'de yayımlanmıştır. SHA-2 ailesi, çoğu kriptografik uygulama için mevcut standarttır. SHA-256, 256-bit (64 hex karakter) özet üretir ve TLS sertifikalarında, Bitcoin madenciliğinde, JWT imzalarında ve kod imzalamada kullanılır. SHA-512, 512-bit özet üretir ve büyük girdiler için 64-bit donanımda SHA-256'dan daha hızlıdır.

SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-512("hello") = 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043

SHA-3 (Keccak)

NIST tarafından halka açık bir yarışmanın ardından 2015'te standartlaştırılmıştır. SHA-3, SHA-2'nin Merkle–Damgård yapısıyla karşılaştırıldığında temelden farklı bir iç yapı (sünger fonksiyonu) kullanır. Bu, SHA-2'de bir zayıflık bulunsa bile SHA-3'ün güvenli kalacağı anlamına gelir. SHA-3, çoğu CPU'da SHA-2'den daha hızlı değildir, ancak bağımsız güvenlik özellikleriyle önemli bir alternatif sunar.

bcrypt

1999'da Niels Provos ve David Mazières tarafından özellikle şifre hashing için tasarlanmıştır. bcrypt otomatik olarak rastgele bir tuz içerir (önceden hesaplanmış gökkuşağı tablosu saldırılarını önler) ve fonksiyonun ne kadar yavaş olduğunu kontrol eden yapılandırılabilir bir maliyet faktörü içerir. Donanım iyileştikçe maliyet faktörünü artırmanız yeterlidir. bcrypt çıktısı tuz ve maliyet faktörünü içerir, bu nedenle hash kendi içinde taşınabilirdir.

bcrypt("password", cost=12) =
  $2b$12$EXRkfkdmXn2gzds2SSitu.MW9.TNJjKVvljQQnqPDFT9cNBivgNS2

Argon2

2015'te Şifre Hashing Yarışması'nın galibi. Argon2, bellek sertliği ekler — bir saldırganın CPU zamanına ek olarak yapılandırılabilir miktarda RAM'e ihtiyacı vardır, bu da GPU ve ASIC kaba kuvvet saldırılarını çok daha pahalı hale getirir. Üç varyant mevcuttur: Argon2d (GPU'ya dirençli), Argon2i (yan kanal dirençli) ve Argon2id (hibrit — çoğu kullanım durumu için önerilen). Argon2, yeni uygulamalar için önerilen seçimdir.

HMAC

HMAC (Hash tabanlı Mesaj Kimlik Doğrulama Kodu), bir mesaj kimlik doğrulama kodu üretmek için herhangi bir hash fonksiyonunu gizli bir anahtarla birleştirir. HMAC hem veri bütünlüğünü (mesajın değiştirilmediğini) hem de özgünlüğünü (yalnızca anahtara sahip birinin üretebileceğini) doğrular. HMAC-SHA256, JWT HS256 imzalarında, API istek imzalamada ve webhook yük doğrulamasında kullanılır.

HMAC-SHA256(key="secret", message="hello") =
  88aab3ede8d3adf94d26ab90d3bafd4a2083070c3bcce9c014ee04a443847c0b

Algoritma Karşılaştırması

Kullanım Alanları

Güvenlik Kuralları

Sıkça Sorulan Sorular

Hash nedir?

Hash (veya hash özeti), bir hash fonksiyonu tarafından herhangi bir boyuttaki giriş verisinden üretilen sabit boyutlu bir dizedir. Hash fonksiyonları tek yönlüdür — girdiden hash'i hesaplayabilirsiniz, ancak hash'ten girdiyi yeniden oluşturamazsınız. Aynı girdi her zaman aynı çıktıyı üretir.

MD5 ile SHA-256 arasındaki fark nedir?

MD5, 128-bit özet üretir ve kriptografik olarak kırılmıştır — çarpışma saldırıları gösterilmiştir. SHA-256, SHA-2 ailesinin bir parçasıdır, 256-bit özet üretir ve çoğu amaç için güvenli kalmaktadır. Her ikisi de şifreleri tek başına hash'lemek için kullanılmamalıdır; bunun yerine bcrypt veya Argon2 kullanın.

Şifreler için neden SHA-256 kullanamazsınız?

SHA-256 hızlı olacak şekilde tasarlanmıştır; bu da kaba kuvvet uygulamayı kolaylaştırır — modern GPU'lar saniyede milyarlarca SHA-256 hash'i hesaplayabilir. bcrypt ve Argon2 gibi şifre hashing algoritmaları kasıtlı olarak yavaştır ve önceden hesaplanmış gökkuşağı tablosu saldırılarını önlemek için rastgele bir tuz içerir.

bcrypt ile Argon2 arasındaki fark nedir?

Her ikisi de şifre hashing için tasarlanmıştır ve tuzlama içerir. bcrypt (1999), hızı kontrol eden yapılandırılabilir bir maliyet faktörüne sahiptir. Argon2 (2015) bellek sertliği ekler — saldırganların CPU zamanına ek olarak büyük miktarda RAM'e ihtiyacı vardır, bu da GPU ve ASIC saldırılarını çok daha pahalı hale getirir. Argon2id, yeni sistemler için önerilen seçimdir.

Hash çarpışması nedir?

Hash çarpışması, iki farklı girdinin aynı hash çıktısını üretmesi durumunda ortaya çıkar. Güvenli bir hash fonksiyonu, bu tür çarpışmaları bulmayı hesaplamalı olarak imkansız kılar. MD5 ve SHA-1, pratik çarpışmalar gösterildiği için kırılmıştır; SHA-256 ve SHA-3 çarpışmaya dirençli olmaya devam eder.

HMAC nedir?

HMAC (Hash tabanlı Mesaj Kimlik Doğrulama Kodu), bir mesaj kimlik doğrulama kodu üretmek için bir hash fonksiyonunu gizli bir anahtarla birleştirir. Hem veri bütünlüğünü hem de özgünlüğünü doğrular. HMAC-SHA256, JWT HS256 imzalarında, API istek imzalamada ve webhook doğrulamasında kullanılır.

İlgili Makaleler

Kaynaklar