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 中整型对象的存储问题
May 16 Python
python中的随机函数小结
Jan 27 Python
python实现换位加密算法的示例
Oct 14 Python
Python中的CSV文件使用&quot;with&quot;语句的方式详解
Oct 16 Python
对Python 语音识别框架详解
Dec 24 Python
python Tkinter版学生管理系统
Feb 20 Python
pycharm访问mysql数据库的方法步骤
Jun 18 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
Jun 26 Python
更新pip3与pyttsx3文字语音转换的实现方法
Aug 08 Python
用Python画小女孩放风筝的示例
Nov 23 Python
Python使用turtle库绘制小猪佩奇(实例代码)
Jan 16 Python
Python爬取豆瓣数据实现过程解析
Oct 27 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
学习discuz php 引入文件的方法DISCUZ_ROOT
2009/06/21 PHP
PHP源码之explode使用说明
2011/08/05 PHP
基于php使用memcache存储session的详解
2013/06/25 PHP
php约瑟夫问题解决关于处死犯人的算法
2015/03/23 PHP
php自定义函数转换html标签示例
2016/09/29 PHP
Yii2框架BootStrap样式的深入理解
2016/11/07 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
PHP中命名空间的使用例子
2019/03/22 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
js实现杯子倒水问题自动求解程序
2013/03/25 Javascript
JavaScript中使用Object.prototype.toString判断是否为数组
2015/04/01 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
JavaScript布尔运算符原理使用解析
2020/05/06 Javascript
HTML元素拖拽功能实现的完整实例
2020/12/04 Javascript
Python 字典(Dictionary)操作详解
2014/03/11 Python
Python打印斐波拉契数列实例
2015/07/07 Python
Python输出汉字字库及将文字转换为图片的方法
2016/06/04 Python
Python中单线程、多线程和多进程的效率对比实验实例
2019/05/14 Python
python实现遍历文件夹图片并重命名
2020/03/23 Python
Python基于stuck实现scoket文件传输
2020/04/02 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
2021/02/07 Python
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
英国高级百货公司:Harvey Nichols
2017/01/29 全球购物
cf战队收人广告词
2014/03/14 职场文书
室内设计专业自荐信
2014/05/31 职场文书
天下第一关导游词
2015/02/06 职场文书
小学母亲节活动总结
2015/02/10 职场文书
2015年市场部工作总结
2015/04/30 职场文书
同意报考公务员证明
2015/06/17 职场文书
初中生活随笔
2015/08/15 职场文书
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL