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模型中的字段和model名显示为中文小技巧分享
Nov 18 Python
在Python中marshal对象序列化的相关知识
Jul 01 Python
python实现文件路径和url相互转换的方法
Jul 06 Python
python绘制简单折线图代码示例
Dec 19 Python
详解python列表生成式和列表生成式器区别
Mar 27 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
Aug 02 Python
Python编写打字训练小程序
Sep 26 Python
Python实现word2Vec model过程解析
Dec 16 Python
Python中import导入不同目录的模块方法详解
Feb 18 Python
tensorflow 2.0模式下训练的模型转成 tf1.x 版本的pb模型实例
Jun 22 Python
利用python 读写csv文件
Sep 10 Python
使用python求解迷宫问题的三种实现方法
Mar 17 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
Twig模板引擎用法入门教程
2016/01/20 PHP
php插入含有特殊符号数据的处理方法
2016/11/24 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
laravel学习笔记之模型事件的几种用法示例
2017/08/15 PHP
让JavaScript和其它资源并发下载的方法
2014/10/16 Javascript
基于zepto.js简单实现上传图片
2016/06/21 Javascript
关于JSON与JSONP简单总结
2016/08/16 Javascript
解决VUEX刷新的时候出现数据消失
2017/07/03 Javascript
jquery插件canvaspercent.js实现百分比圆饼效果
2017/07/18 jQuery
react-native-fs实现文件下载、文本存储的示例代码
2017/09/22 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
react-native android状态栏的实现
2018/06/15 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
详解项目升级到vue-cli3的正确姿势
2019/01/28 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
2020/12/24 Javascript
vue学习笔记之给组件绑定原生事件操作示例
2020/02/27 Javascript
Python标准库之sqlite3使用实例
2014/11/25 Python
在Python的Flask框架下使用sqlalchemy库的简单教程
2015/04/09 Python
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
浅谈python中的面向对象和类的基本语法
2016/06/13 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
python  创建一个保留重复值的列表的补码
2018/10/15 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
2019/08/09 Python
基于keras输出中间层结果的2种实现方式
2020/01/24 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
2020/05/19 Python
Application Cache未缓存文件无法访问无法加载问题
2014/05/31 HTML / CSS
曼联官方网上商店:Manchester United Direct
2017/07/28 全球购物
新教师工作感言
2014/02/16 职场文书
平面设计求职信
2014/03/10 职场文书
人大调研汇报材料
2014/08/14 职场文书
批评与自我批评发言稿
2014/10/15 职场文书
亮剑观后感
2015/06/05 职场文书
搞笑婚庆主持词
2015/06/29 职场文书
学习党史心得体会2016
2016/01/23 职场文书
优秀共产党员事迹材料2016
2016/02/29 职场文书