Python实现的密码强度检测器示例


Posted in Python onAugust 23, 2017

本文实例讲述了Python实现的密码强度检测器。分享给大家供大家参考,具体如下:

密码强度

密码强度如何量化呢?

一个密码可以有以下几种类型:长度、大写字母、小写字母、数字以及特殊符号。

显然,密码包含的特征越多、长度越长,其强度也就越高。

我们设置几个等级来评测密码强度,分别是:terrible, simple,
medium, strong

不同的应用可能对密码强度的要求不一样,我们引入最小程度(min_length)和最小特征数(min_types),作为可配置选项。

这样我们就可以检测密码包含的特征,特征与密码之间的关系可以简单定义为:

特征数 强度
小于最小长度 terrible
常用密码或规则的密码 simple
小于最小特征数 medium
大于或等于最小特征数 strong

另:常用的1万个密码点击此处本站下载

代码实现

check.py

# coding: utf-8
"""
check
Check if your password safe
"""
import re
# 特征
NUMBER = re.compile(r'[0-9]')
LOWER_CASE = re.compile(r'[a-z]')
UPPER_CASE = re.compile(r'[A-Z]')
OTHERS = re.compile(r'[^0-9A-Za-z]')
def load_common_password():
 words = []
 with open("10k_most_common.txt", "r") as f:
  for word in f:
   words.append(word.strip())
 return words
COMMON_WORDS = load_common_password()
# 管理密码强度的类
class Strength(object):
 """
 密码强度三个属性:是否有效valid, 强度strength, 提示信息message
 """
 def __init__(self, valid, strength, message):
  self.valid = valid
  self.strength = strength
  self.message = message
 def __repr__(self):
  return self.strength
 def __str__(self):
  return self.message
 def __bool__(self):
  return self.valid
class Password(object):
 TERRIBLE = 0
 SIMPLE = 1
 MEDIUM = 2
 STRONG = 3
 @staticmethod
 def is_regular(input):
  regular = ''.join(['qwertyuiop', 'asdfghjkl', 'zxcvbnm'])
  return input in regular or input[::-1] in regular
 @staticmethod
 def is_by_step(input):
  delta = ord(input[1]) - ord(input[0])
  for i in range(2, len(input)):
   if ord(input[i]) - ord(input[i - 1]) != delta:
    return False
  return True
 @staticmethod
 def is_common(input):
  return input in COMMON_WORDS
 def __call__(self, input, min_length=6, min_type=3, level=STRONG):
  if len(input) < min_length:
   return Strength(False, "terrible", "密码太短了")
  if self.is_regular(input) or self.is_by_step(input):
   return Strength(False, "simple", "密码有规则")
  if self.is_common(input):
   return Strength(False, "simple", "密码很常见")
  types = 0
  if NUMBER.search(input):
   types += 1
  if LOWER_CASE.search(input):
   types += 1
  if UPPER_CASE.search(input):
   types += 1
  if OTHERS.search(input):
   types += 1
  if types < 2:
   return Strength(level <= self.SIMPLE, "simple", "密码太简单了")
  if types < min_type:
   return Strength(level <= self.MEDIUM, "medium", "密码还不够强")
  return Strength(True, "strong", "密码很强")
class Email(object):
 def __init__(self, email):
  self.email = email
 def is_valid_email(self):
  if re.match("^.+@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", self.email):
   return True
  return False
 def get_email_type(self):
  types = ['qq', '163', 'gmail', '126', 'sina']
  email_type = re.search('@\w+', self.email).group()[1:]
  if email_type in types:
   return email_type
  return 'wrong email'
password = Password()

test_check.py: 用于单元测试

# coding: utf-8
"""
test for check
"""
import unittest
import check
class TestCheck(unittest.TestCase):
 def test_regular(self):
  rv = check.password("qwerty")
  self.assertTrue(repr(rv) == "simple")
  self.assertTrue('规则' in rv.message)
 def test_by_step(self):
  rv = check.password("abcdefg")
  self.assertTrue(repr(rv) == "simple")
  self.assertTrue('规则' in rv.message)
 def test_common(self):
  rv = check.password("password")
  self.assertTrue(repr(rv) == "simple")
  self.assertTrue('常见' in rv.message)
 def test_medium(self):
  rv = check.password("ahj01a")
  self.assertTrue(repr(rv) == 'medium')
  self.assertTrue('不够强' in rv.message)
 def test_strong(self):
  rv = check.password("asjka9AD")
  self.assertTrue(repr(rv) == 'strong')
  self.assertTrue('很强' in rv.message)
 # 测试邮箱
 def test_email(self):
  rv = check.Email("123@gmail.com")
  self.assertEqual(rv.is_valid_email(), True)
 def test_email_type(self):
  rv = check.Email("123@gmail.com")
  types = ['qq', '163', 'gmail', '126', 'sina']
  self.assertIn(rv.get_email_type(), types)
if __name__ == '__main__':
 unittest.main()
Python 相关文章推荐
python正则表达式判断字符串是否是全部小写示例
Dec 25 Python
Python的Django框架中的数据过滤功能
Jul 17 Python
Python3实现Web网页图片下载
Jan 28 Python
Python中的迭代器与生成器高级用法解析
Jun 28 Python
Python金融数据可视化汇总
Nov 17 Python
python MNIST手写识别数据调用API的方法
Aug 08 Python
python3.x实现base64加密和解密
Mar 28 Python
Python第三方库face_recognition在windows上的安装过程
May 03 Python
python3 xpath和requests应用详解
Mar 06 Python
Python flask框架端口失效解决方案
Jun 04 Python
python实现socket简单通信的示例代码
Apr 13 Python
python中tkinter复选框使用操作
Nov 11 Python
python+selenium+autoit实现文件上传功能
Aug 23 #Python
Django与JS交互的示例代码
Aug 23 #Python
python paramiko模块学习分享
Aug 23 #Python
定制FileField中的上传文件名称实例
Aug 23 #Python
基于python元祖与字典与集合的粗浅认识
Aug 23 #Python
Python 多线程Threading初学教程
Aug 22 #Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 #Python
You might like
深入理解PHP之require/include顺序 推荐
2011/01/02 PHP
thinkphp框架page类与bootstrap分页(美化)
2017/06/25 PHP
mongodb和php的用法详解
2019/03/25 PHP
javascript定时保存表单数据的代码
2011/03/17 Javascript
在JS中如何调用JSP中的变量
2014/01/22 Javascript
js Dialog 去掉右上角的X关闭功能
2014/04/23 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
JQuery中attr方法和removeAttr方法用法实例
2015/05/18 Javascript
浅谈JavaScript字符串拼接
2015/06/25 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
微信小程序 progress组件详解及实例代码
2016/10/25 Javascript
jQuery插件FusionCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/06 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
vue循环数组改变点击文字的颜色
2019/10/14 Javascript
node.js如何根据URL返回指定的图片详解
2020/10/21 Javascript
python中遍历文件的3个方法
2014/09/02 Python
python使用7z解压apk包的方法
2015/04/18 Python
Python实现二分查找与bisect模块详解
2017/01/13 Python
python实现拓扑排序的基本教程
2018/03/11 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
python之super的使用小结
2018/08/13 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
在python中求分布函数相关的包实例
2020/04/15 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
Python中Qslider控件实操详解
2021/02/20 Python
拉夫劳伦爱尔兰官方网站:Ralph Lauren爱尔兰
2020/04/10 全球购物
这段代码难道不该打印出56吗
2013/02/27 面试题
竞聘副主任科员演讲稿
2014/01/11 职场文书
四风问题对照检查材料整改措施
2014/09/27 职场文书
房屋维修申请报告
2015/05/18 职场文书
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
2021/06/05 Python
Python Flask请求扩展与中间件相关知识总结
2021/06/11 Python
【海涛dota解说】一房久违的影魔魂守二连发
2022/04/01 DOTA