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中生成器和yield语句的用法详解
Apr 17 Python
Python的Django框架中的表单处理示例
Jul 17 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
Python常用算法学习基础教程
Apr 13 Python
详解 Python 与文件对象共事的实例
Sep 11 Python
Python 实现使用dict 创建二维数据、DataFrame
Apr 13 Python
python 利用jinja2模板生成html代码实例
Oct 10 Python
使用python 的matplotlib 画轨道实例
Jan 19 Python
Python实现UDP程序通信过程图解
May 15 Python
详解pandas获取Dataframe元素值的几种方法
Jun 14 Python
python interpolate插值实例
Jul 06 Python
pytorch 使用半精度模型部署的操作
May 24 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中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
PHP实现货币换算的方法
2014/11/29 PHP
Laravel中使用Queue的最基本操作教程
2017/12/27 PHP
javascript web对话框与弹出窗口
2009/02/22 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
浅析ES6的八进制与二进制整数字面量
2016/08/30 Javascript
JavaScript-html标题滚动效果的简单实现
2016/09/08 Javascript
JS给按钮添加跳转功能类似a标签
2017/05/30 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
vue中倒计时组件的实例代码
2018/07/06 Javascript
Vue-Router的使用方法
2018/09/05 Javascript
vue中tab选项卡的实现思路
2018/11/25 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
[01:30:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第二场 2月2日
2021/03/11 DOTA
python如何实现内容写在图片上
2018/03/23 Python
python 使用re.search()筛选后 选取部分结果的方法
2018/11/28 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
2019/03/26 Python
python的命名规则知识点总结
2019/10/04 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
python爬取豆瓣电影排行榜(requests)的示例代码
2021/02/18 Python
HTML5新特性 多线程(Worker SharedWorker)
2017/04/24 HTML / CSS
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
专业技术职务聘任书
2014/03/29 职场文书
村主任群众路线个人对照检查材料
2014/09/26 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
地道战观后感500字
2015/06/04 职场文书
办公室管理规章制度
2015/08/04 职场文书
关于运动会的广播稿
2015/08/19 职场文书
导游词之苏州寒山寺
2019/12/05 职场文书
Qt自定义Plot实现曲线绘制的详细过程
2021/11/02 Python