Hash, tuz, bcrypt ve Argon2: düzgün bir site şifrenle ne yapar

Yayınlanma yazan David Carrero

Düzgün bir site şifreni bilmez. İstemediğinden değil: bilemediğinden.

Kulağa hile gibi geliyor, çünkü şifreni her yazdığında sistem seni içeri alıyor ve içeri alabilmek için bir şeyi doğrulaması gerekiyor. Ama doğrulamak bilmek değildir. Sunucu, şifrenden hesaplanmış bir iz saklar; sen yazdığında izi yeniden hesaplar ve karşılaştırır. Tutuyorsa, buyur. Şifrenin hiçbir aşamada hiçbir yerde yazılı durması gerekmez.

Ciddi bir hizmeti ciddi olmayandan ayıran en net işaret buradan çıkıyor: şifreni unuttuğunda sana e-postayla geri yolluyorlarsa, o şifre onlarda duruyordu. Ve duran şey, er ya da geç, başkasının eline geçer.

1979 şifreleri saklamama fikri — ve bunu yavaş yapma fikri

1979’da Robert Morris ve Ken Thompson, Communications of the ACM dergisinde “Password Security: A Case History”i yayımladılar ve Unix’te ne yaptıklarını anlattılar. Bir tecrübe aktarımı bu, ve bugün apaçık saydığımız iki fikir orada yerine oturuyor.

Birincisini onlar icat etmedi —şifre yerine hash saklamak zaten yapılıyordu— ama kimsenin anlatamadığı kadar iyi anlattılar: şifreyi saklama, hash’ini sakla. Şifreni rastgele görünüşlü bir değere çeviren ve geri sarılamayan bir fonksiyon: hash’ten şifreye dönüş yok.

İkincisi tamamen onların: tuz. Her kullanıcı için farklı, rastgele bir değer; hash hesaplanmadan önce şifreye karıştırılıyor. Tuz olmazsa aynı şifreyi kullanan iki kişinin hash’i de aynı olur —çalınan dosya, tekrar edenleri bulma oyununa döner— ve daha kötüsü, biri devasa bir tabloyu bir kez önceden hesaplayıp dünyadaki bütün veritabanlarına karşı kullanabilir. Tuz senin şifreni tahmin etmeyi zorlaştırmaz: tahmin etmenin başka kimseye yaramamasını sağlar.

Ama aynı makalede çok daha az anılan üçüncü bir fikir var, ve asıl mesele o: fonksiyonu bilerek yavaş yaptılar. Dalgınlıktan değil. Kasten. Bir şifreyi şifrelemek, teknik olarak gerekenden çok daha pahalıya mal oluyordu, çünkü her sabah bir kez giren adam bunu umursamaz, milyonlarca aday deneyen umursar.

Neredeyse elli yıllık tek bir cümlede işin tamamı.

Yavaşlık neden tek dürüst savunma

Bilişimdeki savunmaların hemen hepsi asimetriktir: savunana ucuz, saldırana pahalıdır. Şifrelemek ucuzdur; anahtarsız çözmek imkânsıza yakındır. Savunan, yapısal bir avantajla oynar.

Şifre saklamada öyle değil. Burada savunan da saldıran da tıpatıp aynı fonksiyonu çalıştırıyor. Sen doğru bildiğini doğrulamak için hash hesaplıyorsun; o, doğru bilip bilmediğini görmek için hesaplıyor. Güvenliğin, iki tarafın da aynı bacaklarla koştuğu tek yarışı bu.

Rakibinden hızlı koşamıyorsan geriye tek hamle kalır: pisti ikiniz için de pahalılaştırmak. Sen bu bedeli her oturum açışta bir kez ödersin. O, her denemede bir kez. Senden kat kat fazla denemeye ihtiyacı olduğu için aynı fatura ikinizi kıyas kabul etmez biçimde vurur. Bir şifre hash’inin yaptığı iş budur.

Başka işlerde harika olan hızlı fonksiyonların —mesela SHA-256— burada berbat bir tercih olmasının sebebi bu. Hızlılar. Hızlı, tam da istemediğimiz şey.

1999 bcrypt ve ayarlanabilir bir parça olarak maliyet

Yavaş fonksiyonun sorunu, donanımın yerinde durmaması. 1979’da yavaş olan, sonra anlık hale geliyor. Bir on yılın bilgisayarlarına göre ayarlanmış bir savunma, kimse dokunmadan kendi kendine yaşlanır.

1999’da Niels Provos ve David Mazières, USENIX Annual Technical Conference’ta bcrypt’i sundular; başlık zaten her şeyi söylüyordu: A Future-Adaptable Password Scheme.

Fikir şu: maliyet fonksiyonun içinde değil, bir parametrede olsun. bcrypt’te senin belirlediğin ve hash’in yanında saklanan bir maliyet katsayısı var. Donanım çok hızlanırsa sayıyı yükseltirsin, yeni şifreler yine olması gerektiği kadar pahalıya mal olur, algoritma değiştirmene gerek kalmaz.

Kendi eskimesini baştan kabul edip ona hazırlanan bir tasarım bu. Bunu yapan yazılım çok azdır.

2009 scrypt ve zamanın yetmediğinin keşfi

bcrypt hesaplama süresini pahalılaştırıyor, ve işe yaradı. Ta ki saldıran, savunanla aynı tür makineyi kullanmayı bırakana kadar.

Bir sunucuda birkaç tane hızlı, genel amaçlı çekirdek vardır. Bir GPU’da ise aynı işi paralel yapan akıl almaz sayıda küçük çekirdek bulunur; ASIC daha da ileri gider: tek bir işlemi yürütmek için üretilmiş silikon. Savunman “bu işlem X’e mal olur”dan ibaretse, biri aynı anda çok sayıda X yapan donanım inşa edebilir. Savunan hâlâ sunucusuyla baş başadır.

2009’da Colin Percival, scrypt’i başka bir argümanla sundu: Stronger Key Derivation via Sequential Memory-Hard Functions. Maliyet yalnızca hesaplamadaysa paralelleşir. Ama bellek bedava değildir. Fonksiyonu bol RAM kullanmaya ve onu atlatılamayacak biçimde dolaşmaya zorla; saldıran birden çekirdek çoğaltamaz hale gelir: her çekirdeğin kendi belleğine ihtiyacı olur. GPU çekirdeklerinin ise gücü çoktur, çekirdek başına RAM’i azdır.

Percival işlemi pahalılaştırmadı. Onu toplu halde tekrarlamak için gereken donanımı pahalılaştırdı. Bu bir seviye değişimi: saldıranın saatine değil, bütçesine saldırılıyor.

2015 Argon2 ve tartışmanın sonu

Birden fazla makul seçeneğin varlığı kimsenin seçim yapmasını kolaylaştırmıyordu. Kriptografi camiası da bir konuyu kapatmak istediğinde ne yapıyorsa onu yaptı: açık bir yarışma. Password Hashing Competition adaylarını topladı, yıllarca açık analize tabi tuttu ve 2015’te kazananı ilan etti: Argon2.

Argon2 iki dersi birden devralır: zaman maliyeti ve bellek maliyeti, ikisi de ayrı ayrı ayarlanabilir, artı iş parçacığı sayısı. Sihir değil. 1979, 1999 ve 2009’un derli toplu sentezi; üstelik işi onu kırmaya çalışmak olan insanlar tarafından gözden geçirilmiş.

Bunun senin için anlamı

Bunların neredeyse hiçbiri senin elinde değil, ve bunu söylemekte fayda var: hash’i site seçer, sen değil. Dünyanın en iyi şifresine sahip olabilirsin ve onu bir Excel dosyasında düz metin olarak saklayabilirler.

Ama denklemin öbür tarafı sana bağlı. Bütün bu bina —tuz, maliyet, bellek— saldıranın her denemesini pahalılaştırmaya yarıyor. Kaç deneme gerekeceğini belirleyen şey ise senin şifren. Sözlükte varsa hiçbir yavaş fonksiyon seni kurtarmaz: ilk sıralarda düşer. Uzunsa ve hiçbir şeye benzemiyorsa, deneme başına düşen o bedel, eldeki zamana sığmayan bir deneme sayısıyla çarpılır.

Bu yüzden üreticimiz yüzde değil entropi biti ölçüyor, ve bu yüzden kontrol aracı sembol saymadan önce şifreni sözlüklerde arıyor. Deneme başına fiyatı onlar koyuyor; deneme sayısını sen koyuyorsun. İki yarımdan biri olmadan diğeri işe yaramaz.

Ve evet: soru hâlâ o eski soru. Yalnızca artık karşı tarafta biri onu saniyede defalarca cevaplamaya çalışıyor, ve biz 1979’dan beri o cevapların her birinin ona para ödetmesi için uğraşıyoruz.


Kaynaklar: R. Morris ve K. Thompson, “Password Security: A Case History”, Communications of the ACM, 1979 · N. Provos ve D. Mazières, “A Future-Adaptable Password Scheme”, USENIX Annual Technical Conference, 1999 (bcrypt) · C. Percival, “Stronger Key Derivation via Sequential Memory-Hard Functions”, 2009 (scrypt) · Password Hashing Competition, kazanan Argon2, 2015.

← Bloga dön