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中lambda与def用法对比实例分析
Apr 30 Python
浅析Python的web.py框架中url的设定方法
Jul 11 Python
python中星号变量的几种特殊用法
Sep 07 Python
Python基于回溯法子集树模板解决取物搭配问题实例
Sep 02 Python
python抓取网站的图片并下载到本地的方法
May 22 Python
基于python log取对数详解
Jun 08 Python
Win10下python3.5和python2.7环境变量配置教程
Sep 18 Python
python实现根据文件关键字进行切分为多个文件的示例
Dec 10 Python
Pycharm 2020年最新激活码(亲测有效)
Sep 18 Python
python和js交互调用的方法
Jun 23 Python
python xlsxwriter模块的使用
Dec 24 Python
如何编写python的daemon程序
Jan 07 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与XML联手进行网站编程代码实例
2008/07/10 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
完美解决thinkphp唯一索引重复时出错的问题
2017/03/31 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
javascript hasFocus使用实例
2010/06/29 Javascript
学习并汇集javascript匿名函数
2010/11/25 Javascript
一些主流JS框架中DOMReady事件的实现小结
2011/02/12 Javascript
node.js中的path.resolve方法使用说明
2014/12/08 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
2015/03/04 Javascript
javascript中in运算符用法分析
2015/04/28 Javascript
AngularJS+Node.js实现在线聊天室
2015/08/28 Javascript
使用jQuery给input标签设置默认值
2016/06/20 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
jQuery插件FusionWidgets实现的Cylinder图效果示例【附demo源码】
2017/03/23 jQuery
iView框架问题整理小结
2018/10/16 Javascript
vue返回上一页面时回到原先滚动的位置的方法
2018/12/20 Javascript
[04:37]DOTA2英雄梦之声Vol20发条
2014/06/20 DOTA
[52:08]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第一局
2016/03/05 DOTA
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
2018/02/23 Python
Python实现的json文件读取及中文乱码显示问题解决方法
2018/08/06 Python
Python3编码问题 Unicode utf-8 bytes互转方法
2018/10/26 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
自学python的建议和周期预算
2019/01/30 Python
对Python中的条件判断、循环以及循环的终止方法详解
2019/02/08 Python
python如何将两张图片生成为全景图片
2020/03/05 Python
用Python制作mini翻译器的实现示例
2020/08/17 Python
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
工作会议方案
2014/05/21 职场文书
2014年个人教学工作总结
2014/12/09 职场文书
计算机专业自荐信
2015/03/05 职场文书
五一晚会主持词
2015/07/01 职场文书
JavaScript使用canvas绘制坐标和线
2021/04/28 Javascript
SQL 聚合、分组和排序
2021/11/11 MySQL
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript