Şifre Hashleme Evrimi
Şifre hashleme algoritmalarını seçerken verilen tavsiyeleri duymuş olabilirsiniz, ancak bunların neden tavsiye edildiğini hiç düşündünüz mü? Bu makalede, şifre hashleme algoritmalarının evrimini ve bunların arkasındaki nedenleri keşfedeceğiz.
Giriş
Şifre hashleme, adından da anlaşılacağı gibi, bir şifreden bir hash değeri hesaplama sürecidir. Hash değeri genellikle bir veritabanında saklanır ve giriş (oturum açma) sürecinde, kullanıcının girdiği şifrenin hash değeri hesaplanır ve veritabanında saklanan hash değeriyle karşılaştırılır. Eşleşirlerse, kullanıcı doğrulanmış olur.
Şifre hashleme algoritmalarının evrimine dalmadan önce, bunun neden gerekliliğini anlamak önemlidir.
Düz metin şifreler: Büyük bir güvenlik riski
Bir web sitesinin kullanıcısı olduğunuzu ve bir hesap kaydettiğinizi düşünün. Bir gün, web sitesi hacklenir ve veritabanı sızdırılır. Eğer web site şifreleri düz metin olarak saklıyorsa, hacker direkt olarak şifrenize erişebilir. Birçok insan birden fazla web sitesinde aynı şifreyi kullanır, hacker bu şifreyi diğer hesaplarınıza izinsiz erişim sağlamak için kullanabilir. E-posta hesabınız için aynı ya da benzer bir şifre kullanıyorsanız, durum daha da kötüleşir çünkü hacker şifrenizi sıfırlayabilir ve tüm ilgili hesaplarınızı ele geçirebilir.
Bir veri ihlali olmasa bile, büyük ekiplerde, veritabanına erişimi olan herkes şifreleri görebilir. Diğer bilgilere göre, şifreler oldukça hassastır ve kesinlikle kimse tarafından görünmesini istemezsiniz.
Şifreleri hashleme olmadan saklamak amatör bir hatadır. Ne yazık ki, "parola sızıntısı düz metin" için arama yaptığınızda, Facebook, DailyQuiz, ve GoDaddy gibi büyük şirketlerin hepsinin düz metin parola sızıntıları yaşadığını göreceksiniz. Muhtemeldir ki, birçok diğer şirket aynı hatayı yapmıştır.
Kodlama v.s. Şifreleme v.s. Hashleme
Bu üç terim genellikle karıştırılır, ancak bunlar farklı kavramlardır.
Kodlama
Kodlama, şifre saklama için hariç tutulacak ilk şeydir. Örneğin, Base64 bir kodlama algoritmasıdır ve ikili veriyi bir karakter dizisine dönüştürür:
Kodlama algoritmasını bilmeniz, kodlanmış dizeyi çözerek orijinal veriyi almanızı sağlar:
Hackerlara göre, çoğu kodlama algoritması düz metine eşdeğerdir.
Şifreleme
Hashleme yaygın hâle gelmeden önce, AES gibi, şifreleri saklamak için şifreleme kullanıldı. Şifreleme, bir anahtar (veya anahtar çifti) kullanarak verileri şifrelemek ve deşifrelemek anlamına gelir.
Şifreleme ile ilgili problem, "deşifre" kelimesinde belirgindir. Şifreleme tersine çevrilebilir, yani bir hacker anahtarı elde ederse, şifreyi deşifre edebilir ve düz metin şifreyi alabilir.
Hashleme
Hashlemenin, kodlamanın ve şifrelemenin arasındaki ana fark, hashlemenin gayri-iade edilebilir olmasıdır. Bir kez bir şifre hashlendi mi, orijinal hâline geri çözülemez.
Bir web site sahibi olarak, aslında şifrenin kendisini bilmek zorunda değilsiniz, kullanıcının doğru şifre ile giriş yapabildiği sürece yeterlidir. Kayıt süreci şu şekilde basitleştirilebilir:
- Kullanıcı şifreyi girer.
- Servis, bir hashleme algoritması kullanarak şifrenin hash değerini hesaplar.
- Servis hash değerini veritabanında saklar.
Kullanıcı giriş yaptığında süreç şöyledir:
- Kullanıcı şifreyi girer.
- Servis, aynı hashleme algoritması kullanarak şifrenin hash değerini hesaplar.
- Servis, hash değerini veritabanında saklanan hash değeri ile karşılaştırır.
- Eğer hash değerleri örtüşürse, kullanıcı doğrulanır.
Her iki süreç de şifrelerin düz metin olarak saklanmasını önler, ve hashleme gayri-iade edilebilir olduğundan, veritabanı ihlal edilse bile, hacker sadece rastgele dize olarak görünen hash değerlerini elde eder.
Hashleme algoritmaları başlangıç paketi
Hashlemenin şifre saklama için mükemmel bir çözüm gibi göründüğünü söyleyebilirsiniz, ancak o kadar basit değil. Nedenini anlamak için, şifre hashleme algoritmalarının evrimine bir göz atalım.
MD5
1992'de, Ron Rivest MD5 algoritmasını tasarladı, bu bir mesaj-digest algoritmasıdır ve herhangi bir veriden 128-bit hash değeri hesaplayabilir. MD5, şifre hashlemesi dahil olmak üzere çeşitli alanlarda geniş çapta kullanılmıştır. Örneğin, "123456"nın MD5 hash değeri:
Daha önce de belirtildiği gibi, hash değeri rastgele bir dize olarak görünür ve gayri-iade edilebilir. Dahası, MD5 hızlı ve uygulanması kolaydır, bu da onu en popüler parola hashleme algoritması yapar.
Ancak, MD5'in avantajları aynı zamanda şifre hashlemedeki zayıflıklarıdır. Hızı, onu kaba kuvvet saldırılarına karşı savunmasız kılar. Eğer bir hacker, yaygın şifreler ve kişisel bilgileriniz hakkında bir liste sahibi ise, her kombinasyonun MD5 hash değerini hesaplayabilir ve bunları veritabanındaki hash değerleri ile karşılaştırabilir. Örneğin, doğum gününüz ile adınızı veya evcil hayvanınızın adını birleştirebilirler.
Bugün, bilgisayarlar daha öncekinden çok daha güçlü, bu da MD5 parola hash'lerini kaba kuvvetle çözmeyi kolaylaştırıyor.
SHA ailesi
Peki, neden daha uzun hash değerleri oluşturan farklı bir algoritma kullanmıyoruz? SHA ailesi iyi bir seçenek gibi görünüyor. SHA-1, 160-bit hash değerleri oluşturan bir hashleme algoritmasıdır ve SHA-2, 224-bit, 256-bit, 384-bit ve 512-bit uzunluklarda hash değerleri oluşturan bir hash algoritması ailesidir. "123456"nın SHA-256 hash değerine bakalım:
SHA-256 hash değeri MD5'ten çok daha uzundur ve ayrıca tersine çevrilemez. Ancak, başka bir sorun var: eğer zaten hash değerini biliyorsanız, yukarıdaki gibi, ve veritabanında tam olarak aynı hash değerini görürseniz, şifrenin "123456" olduğunu biliyorsunuz demektir. Bir hacker, yaygın şifreler ve onların karşılık diziğin hash değerlerinden oluşan bir liste oluşturabilir ve bunları veritabanındaki hash değerleri ile karşılaştırabilir. Bu listeye bir gökkuşağı tablosu denir.
Tuz
Gökkuşağı tablosu saldırılarını hafifletmek için, tuz kavramı tanıtıldı. Tuz, hashlemeden önce şifreye eklenen bir rastgele dizedir. Örneğin, tuz "tuz" ise, ve "123456" parolasını tuz ile birlikte SHA-256 kullanarak hashlemek istiyorsanız, sadece şunları yapmak yerine:
Bunu yapmalısınız:
Gördüğünüz gibi, sonuç tuzsuz hashlemekten tamamen farklıdır. Genellikle, her kullanıcıya kayıt sırasında rastgele bir tuz atanır, bu hash değerinin yanı sıra veritabanında saklanır. Giriş sürecinde, tuz, girilen şifrenin hash değerini hesaplamak için kullanılır, bu sonra saklanan hash değeri ile karşılaştırılır.
İterasyon
Tuz eklenmesine rağmen, donanımın daha güçlü hâle gelmesiyle hash değeri hâlâ kaba kuvvet saldırılarına karşı savunmasızdır. Bunu zorlaştırmak için, iterasyon (yani, hashleme algoritmasının birden çok kez çalıştırılması) tanıtılabilir. Örneğin, bunun yerine :
Bunu kullanabilirsiniz:
İterasyon sayısını artırmak, kaba kuvvetle çözmeyi daha zorlaştırır. Ancak, bu aynı zamanda giriş sürecini etkiler, çünkü yavaşlar. Bu nedenle, güvenlik ve performans arasında bir denge kurulmalıdır.
Yarıyıl molası
Bir mola verip iyi bir şifre hashleme algoritmasının özelliklerini özetleyelim:
- Geri alınamaz (preimage resistance)
- Kaba kuvvetle çözmek zor
- Gökkuşağı tablosu saldırılarına karşı dayanıklı
Belki de fark etmişsinizdir, bu gereksinimlerin tümünü karşılamak için tuz ve iterasyon gereklidir. Sorun, hem MD5 hem de SHA ailesinin özellikle şifre hashlemesi için tasarlanmamış olması; genellikle bütünlük kontrolü (veya "mesaj-digest") için yaygın olarak kullanılırlar. Sonuç olarak, her web site çoğunlukla kendi tuz ve iterasyon uygulamasına sahiptir, bu da standardizasyonu ve geçişi zorlaştırır.
Şifre hashleme algoritmaları
Bu problemi çözmek için, birkaç hashleme algoritması özellikle şifre hashlemesi için tasarlandı. Bunlardan bazılarına bir göz atalım.
bcrypt
bcrypt, Niels Provos ve David Mazières tarafından tasarlanmış bir şifre hashleme algoritmasıdır. Birçok programlama dilinde yaygın olarak kullanılır. İşte bir bcrypt hash değeri örneği:
Her ne kadar başka bir rastgele dize gibi görünse de, ek bilgiler içerir. Şöyle bir ayrıma bakalım:
- İlk bölüm
$2y
algoritmaya işaret eder,2y
. - İkinci bölüm
$12
yineleme sayısına işaret eder,12
. Bu, hashleme algoritmasının 212=4096 kez çalıştırılacağı anlamına gelir (yinelemeler). - Üçüncü bölüm
wNt7lt/xf8wRJgPU7kK2ju
tuzdur. - Son bölüm
GrirhHK4gdb0NiCRdsSoAxqQoNbiluu
hash değeridir.
bcrypt'in bazı sınırlamaları vardır:
- Şifrenin maksimum uzunluğu 72 bayttır.
- Tuz 16 byte ile sınırlıdır.
- Hash değeri 184 bit ile sınırlıdır.
Argon2
Mevcut şifre hashleme algoritmalarının tartışmaları ve sınırlamaları göz önüne alındığında, 2015 yılında bir şifre hashleme yarışması düzenlendi. Detayları atlayıp, kazanana odaklanalım: Argon2.
Argon2, Alex Biryukov, Daniel Dinu ve Dmitry Khovratovich tarafından tasarlanmış bir şifre hashleme algoritmasıdır. Birkaç yeni kavramı tanıtır:
- Bellek zorlu: Algoritma, paralelleştirmenin zor olması için tasarlanmıştır, bu GPU ile kaba kuvvet çözme işlemi zorlaştırır.
- Zaman zorlu: Algoritma, optimizasyonunun zor olması için tasarlanmıştır, bu ASIC'ler (Application-specific integrated circuits) ile kaba kuvvet çözme işlemi zorlaştırır.
- Yan kanal saldırılarına karşı dayanıklı: Algoritma, zamanlama saldırıları gibi yan kanal saldırılarına karşı dayanıklı olması için tasarlanmıştır.
Argon2'nin iki ana sürümü vardır, Argon2i ve Argon2d. Argon2i, yan kanal saldırılarına karşı en güvenli iken, Argon2d GPU kırma saldırılarına karşı en yüksek direnci sağlar.
-- Argon2
İşte bir Argon2 hash değeri örneği:
Bunu ayrıma bakalım:
- İlk bölüm
$argon2i
algoritmaya işaret eder,argon2i
. - İkinci bölüm
$v=19
versiyonu belirtir,19
. - Üçüncü bölüm
$m=16,t=2,p=1
bellek maliyeti, zaman maliyeti ve paralellik derecesini belirtir, bunlar16
,2
ve1
. - Dördüncü bölüm
$YTZ5ZnpXRWN5SlpjMHBDRQ
tuzu tanımlar. - Son bölüm
$12oUmJ6xV5bIadzZHkuLTg
hash değeridir.
Argon2'de, şifrenin maksimum uzunluğu 232-1 bayt, tuz 232-1 byte ile sınırlıdır, ve hash değeri 232-1 byte ile sınırlıdır. Bu, çoğu durum için yeterli olmalıdır.
Argon2 artık birçok programlama dilinde mevcuttur, örneğin Node.js için node-argon2 ve Python için argon2-cffi.
Sonuç
Yıllar içinde, şifre hashleme algoritmaları önemli bir evrim geçirdi. Güvenlik topluluğuna, interneti daha güvenli bir yer hâline getirmek için onyıllarca çaba sarf ettikleri için bir borçluyuz. Onların katkıları sayesinde, geliştiriciler, şifre hashlemenin güvenliğini endişelenmeden daha iyi hizmetler oluşturmaya daha fazla dikkat edebilirler. Bir sistemde %100 güvenlik sağlamak belki ulaşılamayabilir, ancak ilişkili riskleri en aza indirmek için çeşitli stratejiler benimseriz.
Kimlik doğrulama ve yetkilendirmenin uğraştırıcı kısmından kaçınmak isterseniz, Logto'yu ücretsiz denemekten çekinmeyin. Güvenli (Argon2 kullanıyoruz!), güvenilir ve ölçeklenebilir çözümler sunuyoruz, böylece ürününüzü oluşturmaya odaklanabilirsiniz.