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中logging模块的用法实例
Sep 29 Python
Python中的生成器和yield详细介绍
Jan 09 Python
python开启多个子进程并行运行的方法
Apr 18 Python
Python简单实现网页内容抓取功能示例
Jun 07 Python
使用python脚本实现查询火车票工具
Jul 19 Python
python之信息加密题目详解
Jun 26 Python
Python3之字节串bytes与字节数组bytearray的使用详解
Aug 27 Python
Python Pandas对缺失值的处理方法
Sep 27 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
Nov 19 Python
Python hashlib加密模块常用方法解析
Dec 18 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
Jan 27 Python
Python 中的单分派泛函数你真的了解吗
Jun 22 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安全开发 添加随机字符串验证,防止伪造跨站请求
2013/02/14 PHP
PHP删除HTMl标签的实现代码
2013/06/30 PHP
PHPExcel笔记, mpdf导出
2016/05/03 PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
2020/08/20 PHP
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
js有关元素内容操作小结
2011/12/20 Javascript
再谈Jquery Ajax方法传递到action(补充)
2014/05/12 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
js实现的页面加载完毕之前loading提示效果完整示例【附demo源码下载】
2016/08/02 Javascript
利用angular.copy取消变量的双向绑定与解析
2016/11/25 Javascript
js实现类bootstrap模态框动画
2017/02/07 Javascript
javascript 操作cookies详解及实例
2017/02/22 Javascript
Bootstrap警告(Alerts)的实现方法
2017/03/22 Javascript
Javascript 一些需要注意的细节(必看篇)
2017/07/08 Javascript
浅谈Vue的加载顺序探讨
2017/10/25 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
JavaScript事件委托实现原理及优点进行
2020/08/29 Javascript
Python过滤函数filter()使用自定义函数过滤序列实例
2014/08/26 Python
python实现从web抓取文档的方法
2014/09/26 Python
python实现将html表格转换成CSV文件的方法
2015/06/28 Python
Python图像处理之识别图像中的文字(实例讲解)
2018/05/10 Python
python对离散变量的one-hot编码方法
2018/07/11 Python
python操作excel的方法
2018/08/16 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
python通过SSH登陆linux并操作的实现
2019/10/10 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
django-csrf使用和禁用方式
2020/03/13 Python
缅甸网上购物:Shop.com.mm
2017/12/05 全球购物
美国折扣香水网站:The Perfume Spot
2020/12/12 全球购物
大专学生求职信
2014/07/04 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
2015年行政人事部工作总结
2015/05/13 职场文书
详解Python+OpenCV进行基础的图像操作
2022/02/15 Python
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle