Hash Fonksiyonları: Bcrypt

Bcrypt 1999 yılında Niels Provos ve David Mazieres tarafından tasarlanmış bir hash fonksiyonudur. İkili orijinal sunumlarında zamana karşı direnebilecek bir sistem geliştirdiklerini savunurlar. Aradan geçen 22 yıl bu iddaalarını çürütmeye henüz yetmedi.

Bcrypt hash yaratabilmek için 3 malzemeye ihtiyaç duyar. Bir parola örneğinden gidecek olursak bunlar parolanın kendisi, salt ve döngü sayısı yani cost tur. Bcrypt parolayı alır, salt ekler ve ondan sonra hashler. Döngü saysı kadar hash fonksiyonunu çalıştırır. Salt zorunludur ve her parola başına rastgele üretilir.

Döngü sayısı istek ve ihtiyaçlar doğrultusunda yükseltilebilinir ve bcrypti zamana karşı dirençli kılan temel faktör budur. Döngü sayısı yükseldikçe hash hesaplamasının tuttuğu zaman ve ihtiyaç duyduğu CPU & GPU gücü artar. Örneğin 5 yıl sonra şu an kullandığınız döngü sayısı çok kolay hesaplanabilir hale gelir, sizi saldırılara açık bırakırsa döngü sayısını yükselterek bu problemi çözebilirsiniz.

Bcrypt yavaş çalışan bir hash fönksiyonudur ve bu kasıtlıdır. Zira döngü sayısının artması demek hızın düşmesi demektir. Fakat bu olası saldırganların da hızının düşeceği anlamına geldiği için aslında aynı zamanda bir güvenlik mekanizmasıdırda. Örnekler üzerinden gidecek olursak MD5 ile hashlenmiş bir parola yığınına Ruby kullanan bir saldırgan saniyede 140,000 parola kontrol edebilirken, döngü değeri 10 olacak şekilde bcrypt kullanılmış parola yığınındaki rakam 450 dir. Kriptografi fonksiyonunun çabuk hesaplanabilmesi çabuk kırılabileceği anlamına gelir. Peki ideal döngü sayısı nedir? Bu tamamen sizin kullandığınız sunucunun gücüne ve sizin kullanıcılarınızı ne kadar bekletmek istediğine bağlı. Hız ve güvenlik arasındaki dengeyi bulmak için sunucunzu test etmelisiniz. Verdiğiniz döngü sayısı ile parolaların ne kadar hızlı hashlendiklerini gözlemledikten sonra sağlıklı bir karar verebilirsiniz.

Bcrypt her ne kadar iddaalı bir hash fonksiyonu olsa da yanlış uygulanması takdirde 11 milyon parolasını kırdıran Ashley Madison’a dönebilirsiniz. Kullandığınız kütüphanenin dokümantasyonlarını iyi incelemeli ve kafanıza göre ayarlamalar yapmamalısınız.

Bcrypt, parolaları hashlemek için Eksblowfish algoritmasından yararlanır. Eksblowfish ve Blowfish’in şifreleme aşaması tamamen aynı olsa da, Eksblowfish’in anahtar zamanlama aşaması (key schedule phase) sonraki herhangi bir durumun hem salt hem de anahtara (kullanıcı parolası) bağlı olmasını ve her ikisinin de bilgisi olmadan hiçbir durumun önceden hesaplanamamasını sağlar. Bu temel fark nedeniyle, bcrypt tek yönlü bir hash algoritmasıdır. Düz metin şifresini, saltı, döngü sayısını ve anahtarı (parola) bilmeden alamazsınız.

Daha yalın bir anlatım ile salt ve döngü değerini kullanarak paroladan bir şifreleme anahtarı elde edilinir. Daha sonra bu anahtar iyi bilinen bir dizeyi şifrelemek için kullanır ki bu dize ‘’OrpheanBeholderScryDoubt’’ dur. döngü sayısını, tuzu ve parolayı saklar. Bu üç öğenin bilinen bir uzunluğu olduğundan, bunları birleştirmek ve tek bir alanda saklamak, gerektiğinde tekrar ayırmak kolaydır. Birisi kimliğini doğrulamaya çalıştığında, depolanan maliyeti ve tuzu alır. Kullanıcı parolası, maliyet ve tuzdan bir anahtar türetir. Aynı iyi bilinen dizeyi şifreler. Oluşturulan şifre metni saklanan şifre metniyle eşleşiyorsa, kişi başarıyla giriş yaptı demektir.

Tüm bu güvenliğe rağmen zayıf bir parola kaba kuvvet saldırısı (brute force attack) karşısında savunmasız kalacaktır. Kullanıcılarınızı kayıt anı sırasında kuvvetli bir parola seçmeleri için yönlendirmeniz doğru olacaktır.

Veritabanında saklanan, bcrypt ile gölgelenmiş bir metin şunun gibi görünebilir:

2a $ 10 $ vI8aWBnW3fID.ZQ4 / zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa

Bu aslında “$” ile ayrılmış üç alandır:

2a: kullanılan bcrypt algoritması sürümünü tanımlar.

10: döngü sayısıdır

vI8aWBnW3fID.ZQ4 / zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa: gölgelenen salt ve parola metnidir. İlk 22 karakter tuz gerisi paroladır.