MD5 şifreleri tuzlanmış tuzsuz Going

12 Cevap php

Ben popüler hale geliyor LAMP (PHP) web sitesi var.

Ben md5 hash kullanıcı parolaları depolayarak güvenli oynadı.

Ama şimdi bu güvenli değil bakın; Ben md5 hash tuzlu olmalıdır - bu gökkuşağı tabloları kullanarak tuzsuz md5 sağlamalarının çözmek için şu anda mümkün değil çünkü.

Ben ne yapabilirim?

Herkesin yeni bir parola yazın yapmak istemiyorum.

12 Cevap

Bunun yerine tek bir adımda bir karma oluşturmak "2 adım karma" yapabilirsiniz.

Sen adı her parola hash eklemek ve sonra tekrar karma olabilir. Bu eşsiz bilgiler ile tuzlu bir undecryptable karma Thats yaratacaktır.

Tuzlama olağan bir işlemdir

tuz + PWD -> karma

You could do something like: PWD -> Hash -> UserID+Hash -> Hash

(UserID sadece tuz daha karmaşık hale getirmek için ... çekinmeyin Varlığından her çift karma için çok eşsiz bir tuz seçildi Not)

Sen sinek tuzluyorlar edebilirsiniz. Birisi açtığında, o (şifre MD5 toplamını hesaplar ve depolanan karma karşı kontrol eder), normal bir işlem yapar, böylece kod bir parça eklemek ve o başarılı olursa, gelen net karma bir tuzlu versiyonunu recompute Metin şifre girdikleri ve parola dosyasında saklamak.

Sadece kırışıklık size bir süre için her ikisinin bir karışımı olacak beri, her MD5 tuzlanmış olsun veya olmayan bir gösterge eklemek gerekir olmasıdır. Veya, güvenlik küçük kaybı, sen giriş kabul, tuzlu ve tuzsuz ve ya bir hit olmadığını her parolayı kontrol edebilirsiniz. Eğer tuzsuz olduğunu algılayamaz Tabii ki, eğer, o zaman bu noktada yükseltin.

Cevap emin onlar sonraki oturum açma, onları doğrulamak, yeni hash hesaplamak, bayrak çevirmek kullanıcıların karma yeni sistemde, şifreleri hangi bir kayıt veya bayrak çeşit tutmak yapmak basittir.

Birisi günlükleri ve bayrağı ayarlanır Şimdi ne zaman, yeni karma ile kimlik doğrulaması.

Neden md5($originallyHashOfPwd . $salt) sonucunu saklar, hangi kullanıcı bir tabloya yeni bir sütun new_pwd eklemeyin. You can sonra precompute new_pwd ve md5(md5($entered_pwd) . $salt) new_pwd içinde ne kadar sonucu karşılaştırmak için kontrol girişinizi ayarlamak kez bitti. Oturum açma denetimini geçiş bittiğinde, eski sütun silmek.

Bu gökkuşağı tablo tarzı saldırıları durdurmak gerekir.

Hala bir tuz kullanabilirsiniz. Sadece bir tuzu ile birlikte, mevcut karma başka bir hash hesaplanır:

$newHash = md5($salt.$oldHash);

Yeni şifreler için daha sonra kullanmanız gerekir:

$hash = md5($salt.md5($password));

Aynı zamanda onları daha güvenli yaparken şifreleri güncellemek için harika bir yol parolalar için bir tuzlu SHA1 kullanarak değiştirmektir. Bir SHA1 karşı bir çarpışma oluşturmak zordur, ve aynı zamanda MD5 farklı bir dize uzunluğa sahiptir. Bir SHA1 40 karakterden uzun ise bir MD5, 32 karakterden uzun.

PHP bu dönüştürmek için, önce saklanan parola dize uzunluğunu kontrol edin. Bu 32 karakter uzunluğunda ise, eski yöntemi kullanarak şifrenizi kontrol edin ve daha sonra, write a new one using SHA1 to the database.

Eğer yanlış hatırlamıyorsam, bu WordPress Bu sorunu ele tam olarak nasıl olduğunu.

Kullanıcıların sefere oturum açtığınızda dinamik şifreleri yeniden şifrelemek, yani ilk önce doğru olup olmadığını kontrol, sonradan bir tuz ile şifrelemek ve tekrar saklayın.

Sen yeni biçimi saklamak için tablo bir sütun ekleyerek şifreleri geçirebilirsiniz.

Bir kullanıcı başarıyla açtığında yeni sütun boşsa, orada güçlü şifre koymak ve özgün sütun boşaltın. Yeni bir sütun girdi varsa, orada değere girişi karşılaştırın.

Burada iki seçenek

  • Parolaları kendinizi deşifre ve tuz ile onları yeniden kodlamak (I MD5 biraz daha süslü bir şey tavsiye). Eğer şifrelenmemiş şifrelerini inceleyen konum kullanıcıları bilgilendirmek gerekir. Muhtemelen de çok zaman alacak.
  • Onların parolalarınızı yeniden yapmak, ve tuzlu ve şifreli bu mağaza.

Bildiğim kadarıyla ben gördüğünüz gibi, şifreleri kurtarmak başka hiçbir yolu yoktur.

EDIT: Although MD5 is a hash and should not be decodable, it can be broken using rainbow tables: with probability almost one, you can find a unique (here's the probability) string of at most, say, 20 characters with a given hash, especially if your character set is limited, say, to alphanumeric. Strictly speaking, this is not decoding. For all practical purposes, it is. Extra note: producing the rainbow tables, and looking up 1000 password is still going to take a lot of time.

Başkaları tarafından belirtildiği gibi orijinal karma tuz. Burada sadece birkaç noktalar:

  • Tuzlar daha uzun da vardır. Daha içeriyorsa Ayrıca o zaman sadece [a-z0-9] ama uzunluğu her şeyden önce daha iyidir.
  • Birisi zaten DB bir kopyası vardır ve tuz ile aynı şifreleri anmak ise tuz çalışmaz ile, eski karma rehash. Bunun yerine gerçekten yeni bir şifre yapmak için kullanıcıyı zorlama gerekir.
  • Sen en sık kullanılan şifreleri çeşitli listelerine karşı (tuzlu olması ve şifreleri) yeni şifrelerini aynı olmalıdır. Bu "kaba kuvvet" saldırılarda kullanılıyor. İstemi / şifresini değiştirmek için kullanıcı zorlamak.

ne yazık ki, senin tek yolu onların şifreleri yenilemek için kullanıcılara anlatmak için.

Ayrıca rasgele parolalar oluşturmak, ama bu aynı güçlük olduğunu.

edit

Eğer sadece çift depolanan şifreleri kodlamak olabilir. böylece yeni tuzlu karma algoritması olacaktır:

md5(md5($new_password).$salt).':'.$salt

Eski şifreleri kullanımını güncellemek için

md5($old_password.$salt).':'.$salt

Bir sağlanan şifre sadece kullanmak doğru olup olmadığını kontrol etmek

list($stored_password, $salt) = explode(':', $salted_password);
if(md5(md5($provided_password).$salt) == $stored_password) {
  // you are now logged in
}

Uzakta MD5 hareket ediyorsanız, sadece tuzlama atlayın ve germe denilen daha iyi bir tekniğe gitmeli. Özellikle Bcrypt (php ile PHPASS olarak uygulanan) kullanmalısınız.

http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html: İşte neden bcrypt büyük bir bağlantı olduğunu

And here is a short How To: 1. Download the phpass package: http://www.openwall.com/phpass/ 2. Look at test.php for examples like the one below:

require 'PasswordHash.php';
$t_hasher = new PasswordHash(8, FALSE);
$correct = 'plaintextpassword';
$hash = $t_hasher->HashPassword($correct);
$check = $t_hasher->CheckPassword($correct, $hash);

If $check===true (which is the case above) then the password is correct. If your password is 'hello', you would hash it using HashPassword, put the hash in a database, and when a user logs in, call CheckPassword(userenteredpassword,hashInDb) to see if the password is correct