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 相关文章推荐
Django返回json数据用法示例
Sep 18 Python
python strip() 函数和 split() 函数的详解及实例
Feb 03 Python
Python OpenCV实现图片上输出中文
Jan 22 Python
详解python中的装饰器
Jul 10 Python
Python 判断文件或目录是否存在的实例代码
Jul 19 Python
python3中os.path模块下常用的用法总结【推荐】
Sep 16 Python
Python函数的参数常见分类与用法实例详解
Mar 30 Python
Python调用shell命令常用方法(4种)
May 11 Python
Django静态文件加载失败解决方案
Aug 26 Python
python+openCV对视频进行截取的实现
Nov 27 Python
Python实现钉钉/企业微信自动打卡的示例代码
Feb 02 Python
让文件路径提取变得更简单的Python Path库
May 27 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(二)
2012/03/21 PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
2012/07/31 PHP
PHP实现图片自动清理的方法
2015/07/08 PHP
php7新特性的理解和比较总结
2019/04/14 PHP
JavaScript多线程的实现方法
2007/05/08 Javascript
jQuery新闻滚动插件 jquery.roller.js
2011/06/27 Javascript
jQuery实现动画效果的简单实例
2014/01/27 Javascript
Javascript技术栈中的四种依赖注入小结
2016/02/27 Javascript
BootStrap 智能表单实战系列(五) 表单依赖插件处理
2016/06/13 Javascript
分分钟玩转Vue.js组件(二)
2017/03/01 Javascript
es7学习教程之Decorators(修饰器)详解
2017/07/21 Javascript
利用HBuilder打包前端开发webapp为apk的方法
2017/11/13 Javascript
angularjs 的数据绑定实现原理
2018/07/02 Javascript
Vue.js图片预览插件使用详解
2018/08/27 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
toString.call()通用的判断数据类型方法示例
2020/08/28 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
vue-quill-editor插入图片路径太长问题解决方法
2021/01/08 Vue.js
[09:13]2014DOTA2国际邀请赛 中国区预选赛coser表演
2014/05/23 DOTA
[59:53]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第二场 3月6日
2021/03/11 DOTA
进一步理解Python中的函数编程
2015/04/13 Python
Python3实现带附件的定时发送邮件功能
2020/12/22 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
python定位xpath 节点位置的方法
2019/08/27 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
CSS3媒体查询(Media Queries)介绍
2013/09/12 HTML / CSS
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
施华洛世奇巴西官网:SWAROVSKI巴西
2019/12/03 全球购物
英国电信商店:BT Shop
2019/12/17 全球购物
战友聚会邀请函
2014/01/18 职场文书
信用卡工资证明格式
2014/09/13 职场文书
房地产销售助理岗位职责
2015/04/14 职场文书
学前班教学反思
2016/02/24 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL
django如何自定义manage.py管理命令
2021/04/27 Python
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python