Nasıl bir şifre gücünü ölçüyorsunuz?

5 Cevap php

Bana bir şifre nasıl güçlü doğru bir fikir verebilir etkili bir algoritma arıyordu.

Ben farklı web sitelerinde farklı şifre gücü reytingleri almak gibi birkaç farklı web siteleri farklı algoritmalar kullanır bulundu.

5 Cevap

This has grown to my general brain dump of best practices for working with passwords in PHP/MySQL. The ideas presented here are generally not my own, but the best of what I've found to date.


Ensure you are using SSL for all operations involving user information. All pages that involve these forms should check they are being called via HTTPS, and refuse to work otherwise.

Sadece izin verilen başarısız oturum açma sayısını sınırlayarak en saldırıları ortadan kaldırabilir.

Nispeten zayıf şifreler için izin verir, ama kullanıcı başına başarısız oturum açma sayısını saklamak ve bunu aşarsa e-posta ile bir captcha veya şifre doğrulaması gerektirir. Ben 5 benim max hataları ayarlayın.

Presenting login failures to the user needs to be carefully thought out as to not provide information to attackers. A failed login due to a non existent user should return the same message as a failed login due to a bad password. Providing a different message will allow attackers to determine valid user logins.

Ayrıca tam olarak geçerli bir parola ile çok oturumları için bir başarısızlık durumunda aynı mesajı ve bir başarısızlık çok oturumları ve kötü bir şifre dönmek emin olun. Farklı bir mesaj veren saldırganlar geçerli bir kullanıcı şifreleri belirlemek için izin verecektir. Parola sıfırlama zorla kullanıcıları bir adil sayısı sadece ne olduğunu geri koyacağız.

Unfortunately limiting the number of logins allowed per IP address is not practical. Several providers such as AOL and most companies proxy their web requests. Imposing this limit will effectively eliminate these users.


I've found checking for dictionary words before submit to be inefficient as either you have to send a dictionary to the client in javascript, or send an ajax request per field change. I did this for a while and it worked ok, but didn't like the traffic it generated.

Doğal olarak zayıf şifreler eksi sözlük kelimelerin denetlenmesini bazı basit javascript ile pratik istemci tarafı IS.

Sonra, teslim ben sözlük kelimeleri kontrol ve kullanıcı adı şifre ve tersi sunucu içeren tarafı. Çok iyi sözlükler kolayca indirilebilir ve onlara karşı test basittir. Bir burada yakaladım bir sözlük kelimesi için test, tekrar şifre içeren veritabanı, bir sorgu göndermek gerekiyor olmasıdır. Ben bu sorunu var yolu basit bir şifreleme ile elden önce benim sözlük şifrelemek ve konumlandırılmış SALT bitirmek ve daha sonra şifreli parola test oldu. İdeal, ancak fiziksel makineleri ve alt insanlar için düz metin ve sadece tel üzerinde daha iyi değil.

Once you are happy with the password they have picked encrypt it with PHP first, then store. The following password encryption function is not my idea either, but solves a number of problems. Encrypting within PHP prevents people on a shared server from intercepting your unencrypted passwords. Adding something per user that won't change (I use email as this is the username for my sites) and add a hash (SALT is a short constant string I change per site) increases resistance to attacks. Because the SALT is located within the password, and the password can be any length, it becomes almost impossible to attack this with a rainbow table. Alternately it also means that people can't change their email and you can't change the SALT without invalidating everyone's password though.

EDIT: Ben şimdi PhPass yerine benim rulo kendi fonksiyon burada kullanmanızı öneririz, ya da sadece tamamen kullanıcı oturumları unutmak ve yerine OpenID kullanmak istiyorsunuz.

function password_crypt($email,$toHash) {
  $password = str_split($toHash,(strlen($toHash)/2)+1);
  return hash('sha256', $email.$password[0].SALT.$password[1]); 
}

Benim Jqueryish istemci tarafında şifre metre. Hedef bir div olmalıdır. Bu genişlik, 0 ile 100 ve arka plan rengi arasında değişecek bulunuyor komut belirtilen sınıflarına göre değişecektir. Yine çoğunlukla buldum başka şeyler çalındı:

$.updatePasswordMeter = function(password,username,target) {
$.updatePasswordMeter._checkRepetition = function(pLen,str) {
res = ""
for ( i=0; i<str.length ; i++ ) {
    repeated=true;
    for (j=0;j < pLen && (j+i+pLen) < str.length;j++)
        repeated=repeated && (str.charAt(j+i)==str.charAt(j+i+pLen));
    if (j<pLen) repeated=false;
    if (repeated) {
        i+=pLen-1;
        repeated=false;
    }
    else {
        res+=str.charAt(i);
    };
};
return res;
};
var score = 0;
var r_class = 'weak-password';
//password < 4
if (password.length < 4 || password.toLowerCase()==username.toLowerCase()) { 
target.width(score + '%').removeClass("weak-password okay-password good-password strong-password"
).addClass(r_class);
  return true;
} 
//password length
score += password.length * 4;
score += ( $.updatePasswordMeter._checkRepetition(1,password).length - password.length ) * 1;
score += ( $.updatePasswordMeter._checkRepetition(2,password).length - password.length ) * 1;
score += ( $.updatePasswordMeter._checkRepetition(3,password).length - password.length ) * 1;
score += ( $.updatePasswordMeter._checkRepetition(4,password).length - password.length ) * 1;
//password has 3 numbers
if (password.match(/(.*[0-9].*[0-9].*[0-9])/))  score += 5; 

//password has 2 symbols
if (password.match(/(.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~])/)) score += 5; 

//password has Upper and Lower chars
if (password.match(/([a-z].*[A-Z])|([A-Z].*[a-z])/))  score += 10; 

//password has number and chars
if (password.match(/([a-zA-Z])/) && password.match(/([0-9])/))  score += 15; 
//
//password has number and symbol
if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([0-9])/))  score += 15; 

//password has char and symbol
if (password.match(/([!,@,#,$,%,^,&,*,?,_,~])/) && password.match(/([a-zA-Z])/))  score += 15; 

//password is just a nubers or chars
if (password.match(/^\w+$/) || password.match(/^\d+$/) )  score -= 10; 

//verifing 0 < score < 100
score = score * 2;
if ( score < 0 )  score = 0;
if ( score > 100 )  score = 100;
if (score > 25 ) r_class = 'okay-password';
if (score > 50  ) r_class = 'good-password';
if (score > 75 ) r_class = 'strong-password';
target.width(score + '%').removeClass("weak-password okay-password good-password strong-password"
).addClass(r_class);
return true;
};

Temelde saldırıların başlıca türleri önlemek istiyoruz

  • Sözlük saldırıları
  • Kaba kuvvet saldırıları

İlk önlemek için, zayıf ortak kelimeleri içeren şifreleri düşünebilirsiniz. Ikinci önlemek için, makul uzunlukta şifreler (8 + karakter ortak) ve oldukça büyük bir karakter seti ile teşvik etmek istiyoruz (harf, rakam ve özel karakter dahil). Farklı olmak, küçük harf ve büyük harf düşünürsek, bu karakteri büyük ölçüde ayarlayın artırır. Bunu dikkate dengelemek gerekir böylece Ancak, bu bazı kullanıcı toplulukları için bir kullanılabilirlik sorunu oluşturur.

Hızlı bir google arama kaba kuvvet saldırılarına (karmaşık parola) için değil, sözlük saldırıları için hesap çözümler geldi. PHP Password Strength Meter this list of strength checkers kontrol sunucu tarafında çalışır, bu yüzden bir sözlük kontrol etmek için uzun olabilir.

EDIT:

Arada ... Ayrıca kullanıcı başına oturum açma denemelerinin sayısını sınırlamak gerekir. Bu saldırıların iki tip daha az olası hale getirecektir. Etkili değil-kullanıcı-dostu X kötü denemeden sonra bir hesap kilitlemek ve bir parola sıfırlama gerektiren etmektir. Daha kullanıcı dostu ama daha fazla çaba giriş girişimleri arasındaki zaman throttle etmektir. Ayrıca gerektirebilir CAPTCHA ilk birkaç oturum açma girişimleri (yığın taşması pek çok düzenlemeler sonra gerektiren bir şey, ya da çok yeni kullanıcılar için hangi sonra).

Temelde muhtemelen şifre uzunluğu ve karmaşıklığı doğrulamak için Düzenli İfadeler kullanmak istiyorum.

Bu kullanarak javascript yapmanın iyi bir örneği burada bulunabilir:

http://marketingtechblog.com/programming/javascript-password-strength/

Daren Schwenke onu işaret ettiği gibi, you'd better work on the security yourself and not put this in the user hands.

Çünkü the best way to get a password is still social engenering Ama bu, onun şifresi ne kadar güçlü kullanıcıya bazı ipuçları sağlamak için iyi.

Böylece gerçek zamanlı olarak, bir nezaket göstergesi olarak kullanıcı parolası gücünü denetler küçük bir istemci tarafı komut dosyası kesmek olabilir. Bu bloklar bir şey, ama o yeşil :-) döndüğünde ona iyi bir ısınma hissi verir

Temelde ne kontrol etmelisiniz commom duygusu: şifre makul bir miktar, harfler, sayılar ve olmayan alfabetik caracters varsa kontrol edin.

Çok kolayca kendi algo kesmek: sadece 10/10 işareti yapmak:

  • 0 sıfır uzunluğunda şifre;
  • Şifre her 8 caracters (15 güvenli uzunluk olması gerekiyordu) için 2;
  • Bir harf, 2 harflerin kullanımı için +2 kullanımı için 1;
  • 2 numaraları kullanımı için bir dizi +2 kullanımı için 1;
  • 2 olmayan bir alfabetik caracters, 2 kullanımı için 1.

Onlar, kullanıcıların banka / ordu / gizli servis / monthy python film sektöründe değil, vardır (vb, orada harfleri büyük harfle, özel caracters konumlandırılmış nerede vardır) tanrısal şifreleri kontrol etmek gerekmez?

Sen delisin javascript becerileri olmadan bir saat içinde bu kod olabilir.

Ve yine, geçerli parola ve sunucu tarafındaki tüm güvenlik kodu taşımak. Daha iyi,: Eğer doğrulama (açık kimliği örneğin) devredebilir eğer.

Ben bir şifre strengh kontrol etmek için belirli bir algoritma düşünemiyorum. Yapmamız biz birkaç kriter tanımlamak ve şifre kriterlere saygı zaman, biz onun skoru 1 ekleyin. Şifre eşiğine ulaştığında, şifre güçlü. Aksi takdirde zayıf.

Farklı throeshold ile Strengh birçok farklı düzeyde ise tanımlayabilir, ya da belirli bir kriter için farklı bir değer tanımlayabilirsiniz. Örneğin şifre 5 karakteri varsa, biz 1 eklemek, ama 10 var ise, o zaman biz 2 ekleyin.

Burada kontrol etmek için kriter listesi

Length (8 to 12 is ok, more is better) Contains lowercase letter Contains uppercase letter The upper case letter is NOT the first one. Contains number Contains symbols the last character is NOT a human like symbol (ex : . or !) Does not look like a dictionnary word. Some wise password crack contains library of word and letter substitutes (like Library --> L1br@ry )

Bu yardım umuyoruz.