it-swarm-tr.com

Veritabanlarında şifre güvenliği - bugün hala en iyi uygulama?

Olası Kopya:
Hangi şifre karma yöntemini kullanmalıyım?

Yığın taşması ve diğer sitelerdeki veritabanlarında parola güvenliği hakkında bir sürü harika mesaj var ve tamamen yeni olduğum için son günlerde bu konuda daha fazla bilgi edinmeye çalışarak saatler geçirdim. Bununla birlikte, o kadar çok farklı öneri ve en iyi uygulama var ki, hala çok karıştım ...

Ayrıca, 2007-2010 vb hala birçok eski mesajları vardır Ben ne kadar hızlı şeyler değiştiğini gördüğüm gibi ben bu önermek gibi hala kullanmak için yaygın olup olmadığından emin değilim. Bu yüzden, gönderilerde bulduğum şeyi özetlemek ve sonra bulduğum bu yöntemin iyi bir uygulama olup olmadığını sormak istedim ...

Yani, bu bir rehber değil, ama bir özet, çok çok temel olduğunu biliyorum ve hatalar varsa lütfen beni düzeltin!

  1. Sadece bahsetmek gerekirse: asla düz metin şifrelerini saklamamalısınız :)
  2. Karma şifreleri "tek yönlü" yaparsınız, böylece hiç kimse düz metni göremez. Kullanıcı parolayı girdiğinde aynı şekilde hash yapar ve veritabanındaki karma geçişi ile karşılaştırırsınız.
  3. Bir şifre hash ek olarak, tuz gerekir. Tuzu düz parola dizesine ekler ve yeni dizeyi toplarsınız. Düz parola zayıfsa, tuz eklemek daha uzun ve daha güçlü hale getirir.
  4. Tuz ayrıca rasgele olmalıdır ("tuz" teriminin yine de rastgele olduğunu, aksi takdirde "anahtar" olarak adlandırıldığını okudum). Bu, Rainbow masa saldırılarını önlemek içindir, çünkü saldırganın her tuz için bir zaman çizelgesi oluşturması gerekir, bu da zaman açısından çok daha pahalıdır. Ayrıca iki kullanıcı aynı şifreye sahipse, rastgele tuzlar kullanırsanız bunu tanımazsınız.
  5. Tuz bir sır değil! Veritabanında karma parolanın yanında depolanıyor. Bununla birlikte, bir zaman damgası, kullanıcının e-posta adresi veya rastgele bir tuz olarak kullanıcıya bağlı başka bir şey kullanmak en iyi fikir olmayabilir. Bunun bir nedeni olarak; kullanıcıların aynı şifreleri birden çok sitede/hizmette kullanma eğiliminde olduğunu belirtmiştir. Yani, tuz rastgele bir dize olmalı, en iyi okudum 64 bit olur mu?
  6. Bir sonraki adım, karma işlemine (1000 veya daha fazla döngü) yineleme eklemek, böylece tuz parolaya eklenir ve daha sonra tekrar tekrar karıştırılır, bu da kullanıcının oturum açarken beklemesi için sadece bir saniyenin bir kısmı anlamına gelir. , ancak DB'nizde 10.000 girişiniz varsa toplar.
  7. Bir site anahtarı eklerseniz, örn. tuza ek olarak küresel bir varyasyon olarak. Ancak, her zaman saldırganların dosya sisteminize de erişebileceğini düşünmelisiniz.
  8. Hashing algoritmaları: MD5, SHA1 ve diğer zayıf yöntemleri kullanmanın artık güvenli olmadığından emin oldum ...

Peki, SHA256, SHA512 kullanıp kullanmayacağınız konusunda farklı görüşler var mı? Hash_hmac kullanmalı mısınız? Bazıları evet der: ( http://rdist.root.org/2009/10/29/stop-using-unsafe-keyed-hashes-use-hmac/ ) bazıları kütüphanelerin sadece güvenli bir şekilde ... ve sonra bir veya iki kez bir kütüphanede bcrypt veya kabarcık balık olarak kitaplığı kullanmamayı okudum ??

Bir kütüphane kullanmak gerçekten gerekli mi yoksa örn. yeterince böyle bir yöntem:

function hash_password($password, $nonce) {

  for ($i = 0; $i < 5000; $i++) {
    $hashed_pass = hash_hmac('sha512', $hashed_pass . $nonce . $password, $site_key);
    }
  return $hashed_pass;
}

Birçok insan kendi algo'yu icat etmediğini söylüyor, bu yüzden sadece kendi icat ettiği herhangi bir şeyi kullanmaktan biraz korkuyorum.

Tahmin etmenin zor olduğunu tahmin edebiliyorum, ancak günümüzde kullanılan bir yöntem ne kadar süre yeterince güvenli kabul edilebilir?

GÜNCELLEME: Bu nedenle, tüm harika geri bildirimleriniz için teşekkür ederiz. Bir ana nokta eksik, gördüğüm gibi ve birçoğunuzun söylediği gibi: şifre güvenliği, yani güçlü bir şifre temeldir. Sanırım mesajı aldım, tekrar teşekkürler! :)

GÜNCELLEME 2: Sadece tamamlamak için, rastgele bir tuz oluşturmak için kullandığım http://www.lateralcode.com/creating-a-random-string-with-php/ kodunu buldum :

function Rand_string( $length ) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!§$%&/().-:;_#+*[]{}="; 

    $size = strlen( $chars );
    for( $i = 0; $i < $length; $i++ ) {
        $str .= $chars[ Rand( 0, $size - 1 ) ];
    }

    return $str;
}

$random_salt= Rand_string(20);
47
Chris

Genel bilgi:

Güzel bir soru ama söyleyebileceğim tek şey tamamen kullanıma bağlı. Sadece küçük bir web sitesi için kullanırsanız, sadece "script kiddies" sizi ziyaret yüksek şans var, bu durumda tuz ile basit bir SHA1 bugün de yeterli. Bu durumda, 5-8-10 yıl veya daha da fazlası tamamen iyidir, script çocukları kolayca giremeyeceklerini görürlerse gerçekten içine girmezler. Sitenize herhangi bir nedenle (parasal site vb.) Saldırılacaksa, mevcut en yeni işlevleri kullanmalısınız. Bu durumda resmi olmayan ancak önceden taşınmış bir işlevi kullanmak için "risk" bile alıyorum. Şu anda bir SHA3 yarışması var, içinde yüksek paraya sahip olacak websties için, bunların 5 yarışmacısından birini kullanardım.

Önemli olduğunu söylediğim noktalar:

1. rastgele bir tuz, hatta 20 karakter kullanın. Şifreleri kırmak çok daha zorlaşır ve kırılabilir olsalar bile, değerinde olmak çok fazla zaman alır.
2. SHA-1, SHA-2 veya WHIRLPOOL kullanın. İyi tuz ile MD5 de iyidir, ama yine de bunları öneririm.
. Kullanıcıların şifreleri önemsizse harika bir şifreleme kullanabilirsiniz. Sözlük olmayan, büyük harfli uzun parolalar, küçük harfler, sayılar ve semboller kullandıklarından emin olmalısınız, aksi takdirde kaba kuvvetle kolayca kırılabilir. Her yıl şifre değiştirmek zorunda kalabileceklerini düşünebilirsiniz.

Koda:

Birçok kez döngü yapmak yararlı olabilir, ancak 5000'in gerekli olduğunu düşünmüyorum. Normal güvenlik için 3 iyidir, ya da 100, belki 1000 işe yarayabilir, ancak bence 5000 çok fazla. SHA-256 iyidir, ancak bunun için özel olarak geliştirilmiş bir algoritma kullanabilirsiniz, yorumlara bakın.

2
axiomer

Sadece küçük bir şeyi unuttun:

Şifrenin Gizlilik Gücü.

Parlak konunuzun tamamını fazla kilolu sadece 2 kelime.

Gerçekten Stackoverflow üzerinde bunu veya bu karma algoritmayı ve rastgele tuzları kullanmanızı söyleyen yüzlerce konu var.
Ve çok azı, zayıf şifre ile tüm sekiz maddelik liste korumanızın, 2048 bayt uzun tuzlu ekstra güvenli hmac-chmak-bumblemak karmalarının birkaç saniye içinde kırılacağını açıklıyor.

Hatırlayamayan fakir kullanıcılar için $#%H4df84a$%#R şifreler - bir şifre değil, bir parola kullanın.

Is it a good day today, Winkie? Farklı harfleri ve önerilen karmaşıklığın şifresini kullanır ancak hatırlaması daha kolaydır.

Tabii ki ifade "Joe" veya "123" gibi yaygın şifreler kadar yaygın olmamalıdır.
“Günaydın”, “Aman Tanrım! Kenny'yi öldürdüler!” ifadelerden kaçınılmalıdır.
Ama biraz kişilik ekleyerek sorun olmaz:
Oh My God! They moved Cthulhu! yeterince görünüyor

Bahsedilmesi gereken bir diğer şey, sunucu ve tarayıcı arasında güvenli bir iletişim
Onsuz, iletişimde yer alan yönlendiricilerin herhangi birinde basit bir şifre kolayca "koklanabilir".

SSH veya Özet yetkilendirme uygulamasının uygulanması daha az önemli değildir.

10
Your Common Sense

İyi bir karmaya sahip genel amaçlı bir karma işlevi (MD5, SHA1, SHA256), mevcut bilgi işlem gücü göz önüne alındığında, çoğu küçük web sitesi için yeterince güvenli olabilir. Bununla birlikte, Moore yasası yakın gelecekte iyi şifrelerin bile kaba kuvvet saldırılarına maruz kalmasını sağlayacaktır. Sorun, karma işlevlerin çok hızlı bir şekilde hesaplanabilmesidir. En iyi çözüm, çok sayıda yineleme ile bcrypt veya PBKDF2 kullanmaktır. Bcrypt vs PBKDF2http://security.stackexchange.com adresinde tartışıldı.

Bazı insanlar bunun çoğu site için aşırıya kaçtığını düşünebilir, ancak parolaların her zaman yeniden kullanıldığını ve parola depolamanın genellikle bir sorun olana kadar değiştirmeyeceğiniz bir şey olduğunu unutmayın.

Öneriler:

  1. Bcrypt veya PBKDF2 kullanın. SHA3 ​​adaylarını KULLANMAYIN. Henüz keşfedilmemiş güvenlik açıkları içerebilirler.
  2. Rainbow masa saldırılarına karşı korunmak için rastgele bir tuz kullanın.
  3. Kullanıcıları bir parola seçmeye zorlayın.

Daha fazla bilgi

5
tony

hash_hmac() işlevi iyi bir seçim olacaktır, daha zayıf bir karma algoritmanın sorunlarının üstesinden bile gelebilir. Tek sorun, da hızlı olmasıdır. Bu, yeterli işlemci gücü (bulut) ile farklı Rainbow tablolarının oluşturulması mümkün hale gelir, yineleme nedeni budur. Bu yüksek güvenliğe ihtiyacınız varsa, yinelemelerinizin ihtiyaç duyduğu zamanı ölçebilir ve ardından belirli bir süre için gereken yineleme sayısını hesaplayabilirsiniz.

Düzenle:

Yineleme bu sorunu çözebilir, mevcut karmaları geçersiz kılmadan daha sonra yineleme sayısını artırabilecek şekilde yapılmalıdır. Bu, gelecekteki yeni donanıma uyum sağlamak için gereklidir, ancak karma parametrelerini karma ile birlikte depolamayı gerektirir.

Bcrypt karma algoritması bu talepleri karşılamak için tasarlanmıştır, nasıl kullanılacağına dair küçük bir örnek yazdım bcrypt PHP 5. , yorum yapmaya çalıştım, böylece bir neler olduğunu anlayın.

2
martinstoeckli