Kodlama, Hash ve Şifreleme Arasındaki Fark Nedir?

Geliştirici · · 7 dk okuma · Sorgulaa Editör Ekibi

Üç kavram, üç farklı amaç

"Parolaları Base64 ile şifreledik", "MD5 şifresini çözebilir misin?", "veriyi hash'leyip gönderelim, karşı taraf açsın". Bu cümlelerin üçü de yazılım ekiplerinde gerçekten kurulur ve üçü de kavramsal olarak hatalıdır. Kodlama, hash ve şifreleme dışarıdan bakınca benzer görünür: okunabilir bir metin girer, anlamsız görünen bir karakter dizisi çıkar. Ama üçü tamamen farklı sorulara yanıt verir.

  • Kodlama (encoding): "Bu veriyi şu kanaldan bozulmadan nasıl geçiririm?"
  • Hash (özet): "Bu verinin değişmediğinden ya da aynı veri olduğundan nasıl emin olurum?"
  • Şifreleme (encryption): "Bu veriyi yalnızca anahtarı olanların okumasını nasıl sağlarım?"

Ayırt etmenin en kısa yolu iki soru sormaktır: İşlem geri alınabiliyor mu? Geri almak için bir sır gerekiyor mu? Kodlama herkes tarafından geri alınır. Şifreleme yalnızca anahtar sahibi tarafından geri alınır. Hash ise hiç kimse tarafından geri alınamaz. Yanlış aracı seçmek yalnızca terminoloji hatası değildir; gerçek veri sızıntılarının önemli bir kısmı tam olarak bu karışıklıktan doğar.

Kodlama: gizlemek değil, taşımak

Kodlama, veriyi bir gösterimden başka bir gösterime çeviren, herkesçe bilinen ve anahtarsız bir dönüşümdür. Amaç uyumluluktur. Bazı kanallar yalnızca belirli karakterleri güvenle taşır: e-posta protokolü tarihsel olarak yedi bitlik metin için tasarlanmıştır, URL'lerde boşluk ve Türkçe karakter doğrudan yer alamaz, JSON içine ham ikili veri konamaz. Kodlama, veriyi o kanalın kabul ettiği alfabeye tercüme eder.

Base64

Base64, her üç baytı (24 bit) altışar bitlik dört parçaya böler ve her parçayı 64 karakterlik bir alfabeden (A-Z, a-z, 0-9, + ve /) bir karakterle gösterir. Girdi üçün katı değilse sona = işaretiyle dolgu eklenir. Örneğin "Merhaba" metninin Base64 karşılığı TWVyaGFiYQ== olur. Sonuç anlamsız göründüğü için gizlenmiş izlenimi verir, ama herhangi bir Base64 çevirici bu diziyi bir saniyede geri açar. Dönüşümün bedeli boyuttur: çıktı girdiden yaklaşık üçte bir oranında büyüktür; 3 MB'lık bir görsel Base64 olarak yaklaşık 4 MB tutar.

URL kodlama ve diğerleri

URL kodlama (yüzde kodlama) aynı mantığın adres çubuğuna uyarlanmış hâlidir. URL'de özel anlamı olan ya da izin verilmeyen her bayt, yüzde işareti ve iki haneli onaltılık değerle yazılır: boşluk %20, ç harfi UTF-8'de iki bayt olduğu için %C3%A7 olur. Bir arama kutusuna "çay & kahve" yazdığınızda, aradaki & işareti kodlanmazsa sunucu onu parametre ayırıcı sanır; URL kodlamanın varlık nedeni budur. Onaltılık (hex) gösterim, HTML varlıkları ve UTF-8'in kendisi de birer kodlamadır.

Hepsinin ortak özelliği: gizlilik sıfırdır. Algoritma açıktır, anahtar yoktur, geri dönüşüm herkes için mümkündür.

Hash: verinin parmak izi

Hash fonksiyonu, her boyutta girdiyi alıp sabit uzunlukta bir özet üretir. SHA-256, ister yedi harflik bir kelime ister 4 GB'lık bir disk kalıbı verilsin, her zaman 256 bit, yani 64 onaltılık karakter döndürür. İyi bir kriptografik hash fonksiyonunun dört özelliği vardır:

  • Deterministik: Aynı girdi her zaman aynı özeti verir.
  • Tek yönlü: Özetten girdiye matematiksel bir dönüş yolu yoktur. Bu zaten bilgi kuramı açısından da imkânsızdır: 4 GB'lık dosyanın bilgisi 64 karaktere sığmaz, veri geri dönülmez biçimde atılmıştır.
  • Çığ etkisi: Girdideki en küçük değişiklik özeti tamamen değiştirir. "merhaba" kelimesinin SHA-256 özeti 4c6bcdd5… ile başlarken, yalnızca ilk harfi büyütülmüş "Merhaba" için özet 7fdc9f47… ile başlar; iki değer arasında hiçbir benzerlik yoktur.
  • Çakışma direnci: Aynı özeti veren iki farklı girdi bulmak pratikte mümkün olmamalıdır.

"MD5 çözücü" siteler nasıl çalışıyor?

Hash geri alınamıyorsa bu siteler ne yapıyor? Çözmüyorlar, arıyorlar. Milyarlarca yaygın parola ve kelimenin özetleri önceden hesaplanıp dev tablolara yazılmıştır; siz bir özet verdiğinizde tabloda karşılığı varsa gösterilir. "123456" ya da "merhaba" anında bulunur, rastgele üretilmiş yirmi karakterlik bir parola bulunamaz. Yani kırılan şey algoritma değil, tahmin edilebilir girdidir.

MD5, SHA-1, SHA-256: hangisi nerede?

AlgoritmaÖzet uzunluğuDurumUygun kullanım
MD5128 bit (32 hex karakter)Kırık: çakışmalar saniyeler içinde üretilebiliyorYalnızca kötü niyetin söz konusu olmadığı bozulma denetimi, önbellek anahtarı
SHA-1160 bit (40 hex karakter)Kırık: 2017'de pratik çakışma gösterildiYeni sistemlerde kullanılmamalı; eski sistemlerde uyumluluk
SHA-256 / SHA-512256 / 512 bitGüvenli kabul ediliyorBütünlük doğrulama, dijital imza, sertifikalar, HMAC
bcrypt, scrypt, Argon2DeğişkenGüvenli, bilinçli olarak yavaşParola saklama

"Kırık" sözcüğünü doğru okumak gerekir. MD5'in kırık olması, elinizdeki bir özetten girdinin bulunabildiği anlamına gelmez; aynı özeti veren iki farklı dosyanın kasıtlı olarak üretilebildiği anlamına gelir. Bu, imza ve sertifika gibi "özet aynıysa belge aynıdır" varsayımına dayanan her şeyi çökertir: saldırgan masum bir belgeyi imzalatıp imzayı kötü niyetli ikizine taşıyabilir. İndirdiğiniz dosyanın aktarım sırasında bozulup bozulmadığına bakmak için MD5 hâlâ iş görür; dosyanın kötü niyetle değiştirilmediğinden emin olmak içinse SHA-256 kullanılmalıdır.

Parola saklama: hash'in özel bir hâli

Parolaları düz metin saklamak kabul edilemez; şifreleyerek saklamak da doğru değildir, çünkü anahtarı ele geçiren bütün parolaları açar ve sitenin parolanızı bilmesine zaten gerek yoktur. Doğru yöntem özet saklamaktır: girişte yazdığınız parolanın özeti alınır ve kayıtlı özetle karşılaştırılır. Ancak düz SHA-256 burada iki nedenle yetersizdir.

Birinci neden hızdır. SHA-256 büyük dosyaları çabuk işlemek için tasarlanmıştır; bir ekran kartı saniyede milyarlarca özet hesaplar. Sızan bir tabloda zayıf parolalar dakikalar içinde düşer. bcrypt, scrypt ve Argon2 gibi parola özet fonksiyonları ayarlanabilir bir maliyet parametresiyle bilerek yavaşlatılmıştır: tek bir özet örneğin 100 milisaniye sürer. Giriş yapan kullanıcı bunu hissetmez, saldırganın deneme hızı ise milyonlarca kat düşer. Argon2 ve scrypt ayrıca bol bellek ister; bu da ekran kartı ve özel donanım avantajını törpüler.

İkinci neden tuzdur (salt). Her kullanıcı için rastgele üretilen ve özetle birlikte saklanan bu değer, parolaya eklenerek özetlenir. Tuz gizli değildir; görevi, aynı parolayı kullanan iki kişinin özetlerinin farklı çıkmasını sağlamak ve önceden hesaplanmış tabloları işe yaramaz kılmaktır. Modern parola fonksiyonları tuzu kendileri üretir ve çıktıya gömer; geliştiricinin yapması gereken, kendi yöntemini icat etmek yerine dilin ya da çatının sunduğu hazır parola özetleme işlevini kullanmaktır.

Şifreleme: anahtarı olan okur

Şifreleme, veriyi bir anahtar kullanarak okunamaz hâle getirir ve doğru anahtarla birebir geri açar. Algoritmalar herkese açıktır; bütün gizlilik anahtarda toplanır. İki ana aile vardır:

  • Simetrik şifreleme: Şifreleyen ve çözen anahtar aynıdır. AES ve ChaCha20 bu ailedendir. Çok hızlıdır; disk şifreleme, veritabanı alanları, yedekler ve ağ trafiğinin asıl yükü bununla korunur. Zorluğu anahtarı karşı tarafa güvenle ulaştırmaktır.
  • Asimetrik şifreleme: Birbirine matematiksel olarak bağlı bir açık ve bir gizli anahtar kullanılır. Açık anahtarla şifrelenen veriyi yalnızca gizli anahtar açar; gizli anahtarla atılan imzayı herkes açık anahtarla doğrular. RSA ve eliptik eğri algoritmaları bu ailedendir. Yavaştır, bu yüzden büyük veri için değil, anahtar değişimi ve imza için kullanılır.

Gerçek sistemler ikisini birleştirir. HTTPS bağlantısında asimetrik yöntemlerle kimlik doğrulanır ve ortak bir sır üretilir, ardından trafik simetrik AES ya da ChaCha20 ile şifrelenir. Bir incelik daha: şifreleme tek başına verinin değiştirilmediğini garanti etmez. Bu nedenle modern kullanımda AES-GCM gibi, şifrelemeyle birlikte bütünlük etiketi de üreten kimlik doğrulamalı kipler tercih edilir.

Yan yana karşılaştırma

ÖzellikKodlamaHashŞifreleme
AmaçUyumlu taşıma ve gösterimBütünlük, kimliklendirme, parola doğrulamaGizlilik
Geri alınabilir mi?Evet, herkes tarafındanHayırEvet, yalnızca anahtarla
Anahtar var mı?YokYok (HMAC hariç)Var
ÖrneklerBase64, URL kodlama, hex, UTF-8SHA-256, BLAKE3, Argon2AES, ChaCha20, RSA

Doğru aracı seçmek: adım adım

  1. Veriyi daha sonra aynen geri okumanız gerekiyor mu? Gerekmiyorsa, yalnızca "aynı mı, değişti mi" sorusuna yanıt arıyorsanız hash kullanın.
  2. Bu bir parola mı? Öyleyse genel amaçlı hash değil, Argon2 ya da bcrypt gibi bir parola özet fonksiyonu kullanın.
  3. Geri okunacak veri başkalarından gizli kalmalı mı? Evetse şifreleyin ve anahtarın nerede, kimin erişimiyle saklanacağını baştan planlayın. Anahtar veriyle aynı yerde duruyorsa şifreleme bir formaliteden ibarettir.
  4. Gizlilik gerekmiyor, yalnızca veri bir kanala sığmıyor mu? Kodlayın: ikili veriyi metin alanında taşımak için Base64, adres parametreleri için URL kodlama.
  5. Verinin kimden geldiğini ve değişmediğini kanıtlamanız mı gerekiyor? Ortak bir sır varsa HMAC, yoksa dijital imza kullanın.

Sık yapılan hatalar ve özet

  • Base64'ü şifreleme sanmak: HTTP Basic kimlik doğrulamada kullanıcı adı ve parola yalnızca Base64 ile kodlanır; bağlantı HTTPS değilse parola fiilen açıkta gider. Aynı şekilde JWT belirteçlerinin yük kısmı şifreli değil, kodlanmıştır; imza içeriğin değiştirilmesini engeller ama okunmasını engellemez. İçine gizli bilgi konmamalıdır.
  • Parolaları MD5 ya da tuzsuz SHA ile saklamak: Sızıntı durumunda zayıf parolaların büyük bölümü saatler içinde çözülür.
  • Parolaları şifreleyerek saklamak: Geri açılabilen parola, anahtar sızdığında toplu hâlde açılır.
  • Kendi algoritmasını yazmak: Harf kaydırmak, XOR'lamak, iki kez Base64 uygulamak güvenlik değil, karartmadır. Denenmiş kütüphaneleri kullanın.

Özetle: kodlama veriyi taşınabilir, hash doğrulanabilir, şifreleme gizli kılar. Bir dönüşümün çıktısının okunaksız görünmesi, onun güvenli olduğu anlamına gelmez; belirleyici olan, geri dönüş için bir sırrın gerekip gerekmediğidir. Bir Base64 çevirici ya da hash oluşturucu ile birkaç deneme yapmak farkı somutlaştırmanın iyi bir yoludur: Base64 çıktısını geri açabildiğinizi, hash çıktısında ise tek harf değişikliğinin bütün özeti değiştirdiğini kendi gözünüzle görürsünüz.