Hash Almak Nedir? Encryption İle Arasındaki Farklar Nelerdir?
Bilgisayar aleminde çok sık bir şekilde duyduğunuz Hash almak terimini daha sık duyduğunuz encryption terimi ile karıştırmanıza daha fazla dayanamadım ve bu güzel makaleyi sizler için hazırladım. Umarım ki bu yazıdan sonra terimleri olması gerektiği gibi kullanabilirsiniz 🙂
Konuya Kripto
kategorimizde anlattığım şifreleme yöntemleri ile başlarsam daha iyi olacağını düşünüyorum. Çünkü en basit haliyle şifreleme, yani nam-ı değer encryption bir açık metini gizlemek için kullandığımız ilkel veya modern methodlardan oluşmaktadır. Kullandığımız yöntem her ne olursa olsun, eğer encryption işlemine tabi tutmuşsak zamanı geldiğinde bu şifreyi çözebilmemiz de gerekir. Nasıl yani?
Çok eski zamanlarda başlayan şifreleme teknikleri bir bilgiyi taşırken o bilginin güvenle iletilmesini sağlar. Taşınan bu bilgi ulaşması gereken yere vardığında ise çözülerek asıl bilgiye ulaşılması gerekmektedir. Yani bir metini şifreliyorsanız (encryption), zamanı gelince de şifreyi çözüp metnin aslını okuyabilmelisiniz. Bu bir tercih meselesi de değildir elbetteki! Her şifre anahtarıyla çözülebilmeli ve orjinal haline taşınabilmelidir. Yoksa ne anlamı kalır değil mi?
Peki Hash Almak Nedir?
Şifreleme (Encryption) konusunu hallettiğimize göre şimdi hash almak meselesini halledelim. message digest
, checksum
veya digital fingerprint
isimleriyle de adlandırılabilen Hash
, geri dönüşü yani çözülmesi imkansız çıktılar demektir. Asıl şimdi nasıl yani?
Konuya basit bir örnekle devam edersek, elinizde ağırlığı 100gr olan bir cam bardak olsun ve bunu birine kırarak vermek istiyorsunuz. Bunun içinde bardağı düşürüyor ve binlerce parçaya ayırıyorsunuz ve tartıda bu parçaların ağırlığını 100gr olarak görüyorsunuz. Şimdi ağırlığı 100gr eden kırık parçaları birine verip bir süre sonra geri aldığınızda tekrar tartıyorsunuz ve bu sefer ağırlığının 95gr olduğunu görüyorsunuz. Öyleyse parçalardan bazıları kaybolmuş veya farklı bir parçayla değiştirilmiş olabilir. Bunun başka bir açıklaması olamaz ama kesin olan birşey varsa oda verdiğinizle aldığınız şeylerin bir olmadığıdır. Oysa sizin için bardağın şekli önemli değildi, sadece verdiğiniz parçaların aynısını tekrar almak istiyordunuz 🙁
Yukarıdaki örnekte anlattığım aslında tamamen hash almak teriminin öyküsü. Eğer elinizde bir veri var ve bu veriyi bir yere taşıdıktan veya birine emanet ettikten sonra tekrar aldığınızda bozulup bozulmadığını kontrol etmek istiyorsanız o verinin hashini alırsınız. Böylece hash değerini bildiğiniz orjinal verinin bozulup bozulmadığını veya müdahalede bulunup bulunmadığını anlayabilirsiniz.
Nasıl Hash Alınır?
Günümüzde MD5, SHA gibi popüler hashing algoritmaları mevcuttur. Herbirinin formülü farklı ama işleyişi temelde aynıdır. Tüm hashing algoritmaları aldıkları veriyi bir takım matematiksel işlemlerden geçirerek geri hesaplanması ve döndürülmesi imkansız çıktılar üretirler. Yani encryption işlemindekinin tam aksine hashing işleminde orjinal veri geri elde edilemez!
Eğer bu algoritmaların nasıl hesaplama yaptığına dair merakınız varsa MD5 için bu linke, SHA-1 için bu linke tıklayarak hesaplama animasyonuna ulaşabilirsiniz.
Hash Alınmış Veri Geri Dönderilebilir mi?
Yukarıda koyu harflerle yazmama rağmen bu kısmını özel başlık açıyorum çünkü sorunumuzun asıl nedeni, karışılıklığın temelinde yatan soru tam olarak bu. Öyleyse tekrar belirtelim ki hash alınmış bir veri geri orjinaline çevrilemez. Çünkü iki sayının toplamı 100 dür dediğim de bu denklemi sağlayan sonsuz eleman olduğu gibi, matematiksel bir sonuç olan hash içinde aynı durum geçerlidir.
Peki ama internette MD5 kıran siteler var, hani geri çevrilemezdi!
Aynı soruyu üniversitede öğretmenime sormuştum ve o gün bende aynı hatayı yapmıştım 🙂 işin aslı şu ki siz bir siteye girerek elinizdeki metini MD5 e çevirdiğinizde site bu metini ve MD5 hash karşılığını kayıt altına alıyor. Başka birisi girerek sizin bu çevirdiğiniz MD5 hashini arattığında ise veritabanında açık metin hali kayıtlı olduğu için kırılmış gibi size gösteriyor. Halbuki olan tek olay hashi alınmış bir verinin kayıt altına alınarak daha sonra kayıtlı karşılığını göstermekten başka birşey değil. Zaten bunu aradığınız bir hashin karşılığını bulamadığında yazan “No result found in our database” mesajıyla anlayabilirsiniz.
İki Farklı Verinin Hash Karşılıkları Aynı Olabilir mi?
Neden olmasın bu sorunun en kısa cevabıdır. Nasıl ki matematikte (x)²
formülündeki x
yerine 1 ve -1 koyduğumuzda aynı sonucu alıyorsak hashing algoritmalarında da bu ihtimal söz konusudur ve bu olaya collision
denir. Tabi çok zor ihtimallerdir ama maalesef ki MD5 ve SHA-1 için de collision bulunmuştur. Aşağıda linklerini vermeden önce şunu diyerek bu soruyu kapatayım: Collision olayı o hashing algoritmasının güvenilirliğini derinden sarsar. Çünkü iki farklı verinin aynı hash sonucunda olması asla istenmeyen durumdur ve güvenlik tehdidir.
MD5 collision için Tıklayınız
SHA-1 collision için Tıklayınız
Hash Karşılıklarını Nerede Kullanabiliriz?
Bunun birçok cevabı var ama size en çok kullanılan 2 yöntemi anlatmak istiyorum. İlki kayıt olduğunuz sitelerde şifrelerinizi güvenle saklayabilmek için. Daha da detaylandırırsak kayıt olduğunuz siteler şifrelerinizi açık metinler halinde tutmazlar. Çünkü bu güvenlik açığı oluşturur. Bunun yerine şifrelerinizin hash alınmış hallerini tutarlar. Böylece veritabanı çalınsa bile şifrelerinizi gören bir hırsızın işine yaramaz. Siz ise siteye tekrar giriş yaptığınızda yazdığınız şifrenin hashi tekrar alınır ve kayıtlı olan hash ile uyuşuyorsa siteye girebilirsiniz. Eğer uyuşmazsa şifre yanlış uyarısı alırsınız.
Diğer bir yöntemde dosya bütünlüğünü kontrol etmek içindir. Örneğin indireceğiniz programların hash alınmış karşılığını resmi sitelerinde bulabilirsiniz. Siz eğer aynı programı farklı bir sayfadan indirmeye kalktığınızda hashini kontrol eder ve resmi sitedeki hash karşılığı ile uyuşmadığını görürseniz anlarsınız ki dosya üzerinde oynanmıştır. Böylece normal olmayan (virüs, zararlı yazılım vs.) bir durum olduğunu anlayabilirsiniz.
Gördüğünüz gibi bu örnekleri çoğaltabiliriz ama işin özünde hep aynı hikaye kalacaktır.
Nasıl Hash Alabilirim?
Gelelim somut örneklere. Eğer bir metinin hashini almak istiyorsanız yazılım dillerindeki hazır fonksiyonları kullanabilirsiniz. (PHP md5 almak, Python SHA256 kullanımı vs. gibi arama yapabilirsiniz). Bunun dışında online hash alma siteleride oldukça kullanışlıdır. Aşağıda verdiğim linkleri kullanabilirsiniz bu amaç için:
MD5 hash almak için Tıklayınız
SHA256 hash almak için Tıklayınız
Umarım ki yazı faydalı olmuştur. Yinede sormak istediğiniz sorular varsa aşağıda bulunan yorum kısmına yazabilirsiniz. Yeni yazılarımızda görüşmek üzere sağlıcakla kalın.