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中的正则表达式的用法
Apr 09 Python
Python2.x利用commands模块执行Linux shell命令
Mar 11 Python
Python Web框架Tornado运行和部署
Oct 19 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
python并发爬虫实用工具tomorrow实用解析
Sep 25 Python
Python切图九宫格的实现方法
Oct 10 Python
numpy中三维数组中加入元素后的位置详解
Nov 28 Python
PyCharm无法引用自身项目解决方式
Feb 12 Python
Python Selenium截图功能实现代码
Apr 26 Python
Python文件操作模拟用户登陆代码实例
Jun 09 Python
Python爬虫之Selenium多窗口切换的实现
Dec 04 Python
总结几个非常实用的Python库
Jun 26 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学习之 循环结构实现代码
2011/06/09 PHP
PHP JS Ip地址及域名格式检测代码
2013/09/27 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
2014/03/28 PHP
php中的字符编码转换函数用法示例
2014/10/20 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
基于jquery创建的一个图片、视频缓冲的效果样式插件
2012/08/28 Javascript
js显示时间 js显示最后修改时间
2013/01/02 Javascript
常用js字符串判断方法整理
2013/10/18 Javascript
javascript列表框操作函数集合汇总
2013/11/28 Javascript
javascript实现base64 md5 sha1 密码加密
2015/09/09 Javascript
jQuery技巧之让任何组件都支持类似DOM的事件管理
2016/04/05 Javascript
ES6新数据结构Map功能与用法示例
2017/03/31 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
js实现倒计时关键代码
2017/05/05 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
python使用pyhook监控键盘并实现切换歌曲的功能
2014/07/18 Python
Python复制目录结构脚本代码分享
2015/03/06 Python
Python封装shell命令实例分析
2015/05/05 Python
Python金融数据可视化汇总
2017/11/17 Python
python基础教程项目五之虚拟茶话会
2018/04/02 Python
对python制作自己的数据集实例讲解
2018/12/12 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
python装饰器的特性原理详解
2019/12/25 Python
python画图常规设置方式
2020/03/05 Python
Richards网上商店:当代时尚,遍布巴西
2019/11/03 全球购物
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
经理秘书找工作求职信
2013/12/19 职场文书
11月升旗仪式讲话稿
2014/02/15 职场文书
历史学专业求职信
2014/06/19 职场文书
2015教师个人工作总结范文
2015/03/31 职场文书
公司承诺书格式范文
2015/04/28 职场文书
温馨祝福晨语:美丽的一天从我的问候开始
2019/11/28 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang
Python实现天气查询软件
2021/06/07 Python