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之print详解
Sep 28 Python
Python使用py2exe打包程序介绍
Nov 20 Python
python中pandas.DataFrame排除特定行方法示例
Mar 12 Python
python flask实现分页效果
Jun 27 Python
python图像常规操作
Nov 11 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
May 24 Python
Python获取Redis所有Key以及内容的方法
Feb 19 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 Python
pytorch 常用函数 max ,eq说明
Jun 28 Python
Python Pandas数据分析工具用法实例
Nov 05 Python
python调用win32接口进行截图的示例
Nov 11 Python
Appium中scroll和drag_and_drop根据元素位置滑动
Feb 15 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
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
关于svn冲突的解决方法
2013/06/21 PHP
php文件读取方法实例分析
2015/06/20 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
jQuery实现批量判断表单中文本框非空的方法(2种方法)
2015/12/09 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
2017/06/02 jQuery
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
jQuery Ajax 实现分页 kkpager插件实例代码
2017/08/10 jQuery
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
vue双向数据绑定知识点总结
2018/04/18 Javascript
微信小程序按钮去除边框线分享页面功能
2018/08/27 Javascript
Angular ElementRef简介及其使用
2018/10/01 Javascript
vue实现滑动到底部加载更多效果
2020/10/27 Javascript
es6 super关键字的理解与应用实例分析
2020/02/15 Javascript
JavaScript数组常用的增删改查与其他属性详解
2020/10/13 Javascript
Vue实现简单的留言板
2020/10/23 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
vue 项目@change多个参数传值多个事件的操作
2021/01/29 Vue.js
Python实现的ini文件操作类分享
2014/11/20 Python
神经网络理论基础及Python实现详解
2017/12/15 Python
Python学习之Django的管理界面代码示例
2018/02/10 Python
python中字典按键或键值排序的实现代码
2019/08/27 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
2019/09/26 Python
python 读取.nii格式图像实例
2020/07/01 Python
Python操控mysql批量插入数据的实现方法
2020/10/27 Python
Timberland美国官网:全球领先的户外品牌
2016/08/15 全球购物
美国专业级皮肤病和spa品质护肤品的高级零售网站:SkinCareRx
2017/02/06 全球购物
物流专业大学生职业生涯规划书范文
2014/01/15 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
2014领导班子专题民主生活会对照检查材料思想汇报
2014/09/23 职场文书
保安辞职信范文
2015/02/28 职场文书
目标责任书格式范文
2015/05/11 职场文书
入党团支部推荐意见
2015/06/02 职场文书
P站美图推荐——变身女主角特辑
2022/03/20 日漫