确保用户提供的密码是注册或更改密码表格中的强密码的最佳方法是什么?
我有一个主意(在python中)
def validate_password(passwd): conditions_met = 0 conditions_total = 3 if len(passwd) >= 6: if passwd.lower() != passwd: conditions_met += 1 if len([x for x in passwd if x.isdigit()]) > 0: conditions_met += 1 if len([x for x in passwd if not x.isalnum()]) > 0: conditions_met += 1 result = False print conditions_met if conditions_met >= 2: result = True return result
1:消除常用 密码,对照常用密码列表检查输入的密码(例如,查看泄漏的LinkedIn密码列表中的前100.000个密码:http : //www.adeptus- mechanicus.com/codex/linkhap/combo_not.zip),请确保包括leetspeek替代词:A @,E3,B8,S5等。 在转到下面的第2部分之前,请从输入的短语中删除打击此列表的部分密码。
2:不要对用户强加任何规则
密码的黄金法则是越长越好。 不用强迫使用大写字母,数字和符号,因为(绝大多数)用户将:-将第一个字母大写;-将数字1放在末尾;- !如果需要符号,则在其后放一个。
1
!
而是检查密码强度
有关体面的起点,请访问:http : //www.passwordmeter.com/
我建议至少遵循以下规则:
Additions (better passwords) ----------------------------- - Number of Characters Flat +(n*4) - Uppercase Letters Cond/Incr +((len-n)*2) - Lowercase Letters Cond/Incr +((len-n)*2) - Numbers Cond +(n*4) - Symbols Flat +(n*6) - Middle Numbers or Symbols Flat +(n*2) - Shannon Entropy Complex *EntropyScore Deductions (worse passwords) ----------------------------- - Letters Only Flat -n - Numbers Only Flat -(n*16) - Repeat Chars (Case Insensitive) Complex - - Consecutive Uppercase Letters Flat -(n*2) - Consecutive Lowercase Letters Flat -(n*2) - Consecutive Numbers Flat -(n*2) - Sequential Letters (3+) Flat -(n*3) - Sequential Numbers (3+) Flat -(n*3) - Sequential Symbols (3+) Flat -(n*3) - Repeated words Complex - - Only 1st char is uppercase Flat -n - Last (non symbol) char is number Flat -n - Only last char is symbol Flat -n
仅仅遵循密码表是不够的,因为足够确定其朴素的算法看起来Password1!是好的,而它却异常弱。确保在计分时忽略首字母大写以及尾随数字和符号(按照最后3条规则)。
Password1!
3:不允许任何太弱的密码 与其强迫用户屈服于自欺欺人的规则, 还不如允许任何 得分高的事情。多少取决于您的用例。