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 30 Python
python在控制台输出进度条的方法
Jun 20 Python
浅谈python新手中常见的疑惑及解答
Jun 14 Python
Python机器学习之SVM支持向量机
Dec 27 Python
python中文编码与json中文输出问题详解
Aug 24 Python
Python字典的核心底层原理讲解
Jan 24 Python
Python批量生成特定尺寸图片及图画任意文字的实例
Jan 30 Python
使用python实现滑动验证码功能
Aug 05 Python
python3中替换python2中cmp函数的实现
Aug 20 Python
Python yield的用法实例分析
Mar 06 Python
python实现UDP协议下的文件传输
Mar 20 Python
OpenCV-Python直方图均衡化实现图像去雾
Jun 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
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
PHP中路径问题的解决方案
2006/10/09 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
thinkPHP5框架路由常用知识点汇总
2019/09/15 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
php上传后台无法收到数据解决方法
2019/10/28 PHP
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
javascript 弹出层组件(升级版)
2011/05/12 Javascript
javascript ready和load事件的区别示例介绍
2013/08/30 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
Javascript实现飞动广告效果的方法
2015/05/25 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
JavaScript面试开发常用的知识点总结
2016/08/08 Javascript
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
使用vue制作探探滑动堆叠组件的实例代码
2018/03/07 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
vue+element导航栏高亮显示的解决方式
2019/11/12 Javascript
JavaScript实现省市联动效果
2019/11/22 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
[01:43]深扒TI7聊天轮盘语音出处4
2017/05/11 DOTA
深入了解Python数据类型之列表
2016/06/24 Python
Python多继承顺序实例分析
2018/05/26 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
详解如何通过H5(浏览器/WebView/其他)唤起本地app
2017/12/11 HTML / CSS
以下为Windows NT 下的32 位C++程序,请计算sizeof 的值
2016/12/07 面试题
出国留学自荐信
2013/10/25 职场文书
初中英语课后反思
2014/04/25 职场文书
做一个有道德的人活动方案
2014/08/25 职场文书
2014法制宣传日活动总结范文
2014/11/01 职场文书
2014年实习班主任工作总结
2014/11/08 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
英语辞职信怎么写
2015/02/28 职场文书
python glom模块的使用简介
2021/04/13 Python
java如何实现socket连接方法封装
2021/09/25 Java/Android