“Hello, World!” Metninin SHA-256 Hash’i
Hello, World! metninin SHA-256 hash’i:
dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
Bu, 256 biti temsil eden 64 onaltılık karakterdir. Bunu herhangi bir ortamda doğrulayabilirsiniz:
# Terminal (macOS/Linux)
echo -n "Hello, World!" | sha256sum
# macOS alternatifi
echo -n "Hello, World!" | shasum -a 256
# Python
import hashlib
hashlib.sha256(b"Hello, World!").hexdigest()
# Node.js
const crypto = require('crypto');
crypto.createHash('sha256').update('Hello, World!').digest('hex');
Hepsi dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f döndürmelidir. Farklı bir sonuç alırsanız, sondaki yeni satırı kontrol edin. -n olmadan echo bir yeni satır ekler, girdiyi ve hash’i değiştirir.
SHA-256 Gerçekte Ne Yapar
SHA-256, 2001’de NIST tarafından standartlaştırılan SHA-2 ailesinin bir parçasıdır. İsteğe bağlı uzunlukta bir girdi alır ve sabit 256-bit çıktı üretir. Algoritma birkaç aşamada çalışır:
Ön işleme
Girdi, uzunluğu 512 bit mod 448’e uygun olacak şekilde doldurulur. Orijinal mesaj uzunluğunun 64-bit temsili eklenir. Bu, toplam uzunluğun 512 bitin katı olmasını sağlar.
Mesaj çizelgesi
Doldurulmuş girdi, 512-bit bloklara bölünür. Her blok, bit düzeyinde işlemler (XOR, sağa kaydırmalar, döndürmeler) kullanılarak 64 adet 32-bit kelimeye genişletilir.
Sıkıştırma
Bir sıkıştırma fonksiyonu, 64 kelime artı ilk 64 asal sayının küp köklerinin kesirli kısımlarından türetilen 64 yuvarlak sabiti kullanarak geçerli hash durumunda 64 tur çalıştırır. Durum, ilk 8 asal sayının kesirli kareköklerinden başlatılan sekiz adet 32-bit değişkendir (a’dan h’ye).
Son hash
Tüm bloklar işlendikten sonra, sekiz durum değişkeni birleştirilerek 256-bit çıktı üretilir.
Önemli Olan Dört Özellik
Belirleyici (Deterministic)
Aynı girdi her zaman aynı hash’i üretir. Hello, World! her zaman dffd6021... olur. Bu, hash’leri kararlı tanımlayıcılar olarak kullanışlı kılar.
Sabit uzunluklu çıktı
Tek bir karakter ve 10 GB’lık bir dosyanın her ikisi de 256-bit hash üretir. Bu özellik, hash’leme işlemini dosyaları içeriklerini bayt bayt karşılaştırmadan karşılaştırmak için kullanışlı kılar.
Çığ etkisi (Avalanche effect)
Girdideki tek bir biti değiştirmek, çıktıyı tamamen değiştirir. Hello, World! ve Hello, World? neredeyse hiçbir biti paylaşmayan hash’ler üretir. Bu, hash’teki küçük değişikliklerden girdi hakkında hiçbir şey çıkarılamayacağı anlamına gelir.
Ön görüntü direnci (Preimage resistance)
Bir hash verildiğinde, girdiyi bulmak için geriye doğru çalışamazsınız. Bu, parola hash’leme (üst düzeyde) ve dijital imzaların temelidir.
SHA-256 Nerelerde Kullanılır
Dosya bütünlük doğrulaması
Bir yazılım indirdiğinizde, proje genellikle ikili dosyanın yanında bir SHA-256 sağlama toplamı yayınlar. İndirilen dosyayı hash’ler ve karşılaştırırsınız. Eşleşirlerse, dosya aktarım sırasında kurcalanmamıştır.
sha256sum downloaded-file.tar.gz
# yayınlanan sağlama toplamı ile karşılaştırın
Bitcoin
Bitcoin’in iş ispatı (proof of work) algoritması, madencilerin SHA-256(SHA-256(block_header)) işleminin hedef değerin altında bir hash ürettiği bir nonce bulmasını gerektirir. Çift SHA-256 yapısı Satoshi Nakamoto tarafından, tek SHA-256’yı etkileyen uzunluk uzatma saldırılarına karşı savunma yapmak için seçilmiştir.
TLS sertifika doğrulaması
X.509 sertifikaları, içeriklerinin bir hash’i ile imzalanır. SHA-256, sertifika imzaları için standarttır; SHA-1, 2017 civarında güvenilen sertifika otoritelerinden kaldırılmıştır.
HMAC yapısı
HMAC-SHA-256, SHA-256’yı bir mesaj kimlik doğrulama kodunda temel hash olarak kullanır. JWT imza doğrulamasında (HS256), AWS istek imzalamada ve birçok API kimlik doğrulama şemasında kullanılır.
Git nesne depolama
Git, her dosyayı, dizin ağacını ve commit’i içerik adresli bir nesne olarak saklar. Nesnenin SHA’sı (tarihsel olarak SHA-1, SHA-256’ya geçiş yapılıyor) içeriğinden hesaplanır ve hem depolama anahtarı hem de bütünlük kontrolü olarak kullanılır.
SHA-256 Parola Depolama İçin Yeterli Değildir
SHA-256, kasıtlı olarak hızlıdır. Dosya bütünlüğü ve dijital imzalar için hız arzu edilir. Parola hash’leme için bu bir yükümlülüktür. GPU’ya sahip bir saldırgan saniyede milyarlarca SHA-256 hash’i hesaplayabilir, bu da SHA-256 ile hash’lenmiş bir parola veritabanına karşı kaba kuvvet ve sözlük saldırılarını pratik hale getirir.
Bunun yerine, amaca yönelik oluşturulmuş bir parola hash’leme fonksiyonu kullanın:
- bcrypt: kasıtlı olarak yavaş, yapılandırılabilir maliyet faktörü ile. Çoğu web uygulaması için standart seçim.
- Argon2: Parola Hash’leme Yarışması (2015) birincisi. Yapılandırılabilir bellek ve CPU maliyeti, GPU saldırılarına dirençli.
argon2idvaryantını tercih edin. - scrypt: Argon2 gibi bellek yoğun, bazı kripto paralar tarafından kullanılır.
Bu fonksiyonlar, kullanıcı başına rastgele bir tuz içerir (gökkuşağı tablosu saldırılarını önler) ve donanım geliştikçe yavaşlatılmak üzere tasarlanmıştır.
Parola depoluyorsanız, tuzlu bile olsa doğrudan SHA-256 kullanmayın. bcrypt veya Argon2 kullanın.
SHA-256, SHA-1 ve MD5 Karşılaştırması
| Algoritma | Çıktı uzunluğu | Durum |
|---|---|---|
| MD5 | 128 bit (32 hex karakter) | Kırık. Pratik çarpışma saldırıları var |
| SHA-1 | 160 bit (40 hex karakter) | Kırık. SHAttered saldırısı (2017) pratik çarpışma gösterdi |
| SHA-256 | 256 bit (64 hex karakter) | Güvenli. Bilinen zayıflık yok |
| SHA-3-256 | 256 bit (64 hex karakter) | Güvenli. Farklı iç yapı (Keccak sponge) |
MD5 ve SHA-1, çarpışma direncinin önemli olmadığı güvenlik dışı bağlamlarda (hata tespiti için sağlama toplamları, eski sistem tanımlayıcıları) hala kullanılmaktadır. Bir saldırganın aynı hash’e sahip iki girdi üretmeye çalışabileceği herhangi bir bağlamda (sertifika sahteciliği, dosya değiştirme, imza sahteciliği) yalnızca SHA-256 veya daha güçlüsü kullanılmalıdır.