it-swarm-tr.com

HMAC-ed şifresi bcrypt-ed veya scrypt-ed şifresinden daha güvenli midir?

Bir seçenek göz önüne alındığında, hangisini seçmeliyim, şifreyi güvenli bir şekilde saklamak için bir HMAC veya bir bcrypt veya scrypt kütüphanesi?

25
user917279

Bilgisayar parola karmalarının sorunları ve incelikleri ile HMAC'nin neden bu soruna uygun olmadığı hakkında doğru bir fikir vermek için, soruyu doğrudan cevaplamak için gerçekten gerekli olandan çok daha geniş bir cevap vereceğim.

Bir HMAC karma algoritması, aslında, normal bir karma algoritmanın sadece anahtarlı bir versiyonudur. Genellikle bütünlüğü ve orijinalliği doğrulamak için kullanılır. Bunun olağan gösterimi H(m,k) = h'dir; burada H, HMAC karma algoritmasıdır, m mesajıdır, k anahtardır ve h sonuçta ortaya çıkan karedir. Fikir şu ki, bir sırrı paylaşan iki taraf k diğer kişinin m'in yazarı olduğunu doğrulayabilir. Ayrıca, bir saldırgan k bilmeden bir ileti karmasını oluşturamaz.

Bu aşağıdaki gibi yapılır:

  1. Alice ve Bob, paylaşılan bir gizli anahtarı k biliyorlar.
  2. Alice m mesajı yazar ve HMAC karmasını k, yani H(m,k) = h kullanarak hesaplar.
  3. Alice, Bob'a m ve hash h mesajını gönderir.
  4. Bob H(m,k) hesaplar ve bunu Alice'in gönderdiği h karmasıyla karşılaştırır. Hashler eşleşirse Alice'in mesajı gönderdiğini ve hash yaptıktan sonra değiştirilmediğini bilir.

Artık HMAC'nin ne olduğunu anladığınıza göre, gerçekten yapmak istediğiniz şeye geçelim - şifreleri bir veritabanında saklayın.

Yıllar önce, şifreleri veritabanlarında düz metin olarak saklamak standart bir uygulamadır. Bu kötü bir fikirdi, çünkü veritabanı tehlikeye atıldığında saldırgan tüm şifreleri aldı. Bununla mücadele etmek için, tek yönlü şifreleme karma algoritmaları kullanarak veritabanında parolalar oluşturmaya başladık. MD5 popüler oldu, ancak keşfedilen zayıflıklar (çarpışmalar, kısmi preimage, vb.) Artık önerilmediği anlamına geliyor. Bir çok insan daha güvenli olan SHA1'e geçti.

Bu yaklaşımla ilgili sorun, büyük bir karma tablo ve bunların karşılık gelen düz metinlerini oluşturmanın mümkün olmasıdır. Bunlara Gökkuşağı tabloları denir. Tüm olası şifreler (belirli bir kümede) için büyük bir karma listesi hesaplamanın ve daha sonra saklamanın daha verimli olduğu kavramı üzerinde çalışırlar, böylece daha sonra hızlı bir şekilde sorgulanabilir. Böylece, kaba zorlayan bireysel karmalar yerine, veritabanını bir karma için sorgulamak ve düz metnini hemen döndürmek mümkün hale geldi.

Bunu düzeltmek için güvenlik nerds tuzları icat etti. Tuzlar, şifrelenmeden önce parolalara eklenen büyük ve benzersiz rastgele değerlerdir. Bu tuz karma ile birlikte saklanır, böylece daha sonra tekrar hesaplanabilir. Bu nedenle, H(m+s) = h değerini hesaplıyoruz, sonra h ve s veritabanında saklıyoruz. Bu, Rainbow tablolarına karşı koruma sağlar çünkü her tuz için ayrı bir Rainbow tablosu oluşturulmasını gerektirir.

Böylece, kötü adamlar sözlük saldırılarına ve kaba kuvvet çatlamasına geri döndüler. GPU hesaplamanın ortaya çıkmasıyla, orta derecede güçlü bir grafik kartında saniyede milyarlarca karmayı hesaplamak mümkün hale geldi. Aslında, insanlar neredeyse 50 milyar MD5 karması saniyede - oldukça etkileyici/korkutucu hesaplayabilen bilgisayarlar geliştirdiler. GPU'ların bunu yapabilmesinin nedeni, çok sayıda paralel skaler operasyon yapmak için tasarlanmış olmalarıdır. Skaler operasyonlar dal içermeyen matematik ve mantık operasyonlarıdır, yani çok fazla/herhangi bir "x sonra y yaparlar". Şifreleme karma algoritmaları bu modele uyma eğilimindedir.

Bunu zorlaştırmak için, kaba işlemi zorlanamaz hale getirmek için yeterince yavaş hale getirmeliyiz. Normal karma algoritmalar (örn. SHA1) hızlı olacak şekilde tasarlanmıştır, bu da onları bu amaç için uygun hale getirmez. HMAC çok az ek yük ve ekstra güvenlik payı eklemediğinden, burada da fazla kullanılmaz.

Yavaş bir şifreleme karma algoritması oluşturmak yapmaktan daha kolaydır - yavaş, indirgenemez (yani mevcut durumunun ötesinde optimize edilemez) ve güvenli olan bir algoritma bulmak çok zordur. Bunu yapabilen üç popüler karma işlevi vardır: PBKDF2 , bcrypt ve scrypt . Bunlar, uyarlanabilir anahtar türetme işlevleri olarak bilinir, çünkü düz metin ve tuzla birlikte bir iş faktörü değerini kabul ederler. İş faktörü, karmayı hesaplamak için gereken süreyi değiştirir ve gelecekteki donanım geliştirmelerine karşı koruma sağlamak için tasarlanmıştır.

Dolayısıyla, bir uyarlanabilir anahtar türetme algoritması H için H(m,s,w) = h hesaplıyoruz, burada m mesajdır (şifre), s tuzdur ve w iş faktörüdür. Sonuçta ortaya çıkan h genellikle s ve w içerir, böylece bir doğrulama işlevi daha sonra aynı parametreleri kullanarak aynı karmayı hesaplayabilir. İş faktörü genellikle dahili bir kriptografik ilkelde gerçekleştirilen yineleme sayısını kontrol eder. Amaç, hesaplamanın çatlamayı olanaksız hale getirmek için yeterince uzun sürmesini sağlamak, ancak sahip olduğumuz kaynakları aşmamaktır.

Özel donanım tabanlı çatlamaya karşı daha fazla güvenlik sağlamak için scrypt, karma hesaplamanın hem CPU hem de bellek açısından zor olmasını sağlar, yani karma değerini üretmek için önemli CPU ve bellek kaynakları gerektirir. Bu önemlidir, çünkü FPGAs genellikle çok az ani belleğe erişebilir.

Şimdi, açık bir soru ortaya çıkıyor: sitemi bcrypt kullanacak şekilde ayarlarsam, bu sunucumun CPU-yoğun karmaları her zaman hesaplaması gerektiği anlamına gelmez mi? Onları sunucunuzda çalıştırırsanız, evet, bu dikkate alınması gereken bir şeydir. Daha iyi bir çözüm, istemcinin karmayı hesaplaması ve ardından SSL üzerinden sunucuya göndermesidir. Sunucu daha sonra veritabanındaki değerle karşılaştırabilir. Bu, çalınması durumunda parola karmasının kolayca kırılmamasını (örn. Bir veritabanı güvenliği yoluyla) ve sunucunuzun parola karması hesaplaması yükü tarafından boğulmamasını sağlar. Web siteleri için jsBcrypt kullanabilirsiniz.  Güncelleme: Bu yöntem, aşağıdaki yorumcu tarafından kusurlu olarak belirtilmiştir. Kullanma.

Umarım bu size durum hakkında ve HMAC'nin bu tür kullanım için neden uygun olmadığına dair iyi bir genel bakış sağlar.

37
Polynomial

HMAC çok hızlı olacak şekilde tasarlanmıştır ve bu bağlamda sadece eklemek yerine şifreye tuz eklemenin iyi bir yoludur. Bcrypt yavaş başlatma nedeniyle çok daha yavaştır, scrypt ise Bcrypt'ten bile daha yavaştır, çünkü bilerek bu şekilde tasarlanmıştır. Scrypt, kaba zorlamayı çok hesaplı olarak pahalı hale getirmek için tasarlanmıştır. Çok fazla CPU, bellek tüketir ve ayrıca GPU'larda kullanımı yavaştır.

Scrypt hakkında daha fazla bilgi

2
Matrix