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 25 Python
python与sqlite3实现解密chrome cookie实例代码
Jan 20 Python
python+splinter实现12306网站刷票并自动购票流程
Sep 25 Python
实例详解Matlab 与 Python 的区别
Apr 26 Python
python实现猜拳小游戏
Apr 05 Python
python实现静态web服务器
Sep 03 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
Dec 13 Python
Python高阶函数、常用内置函数用法实例分析
Dec 26 Python
手把手教你将Flask应用封装成Docker服务的实现
Aug 19 Python
Python中的面向接口编程示例详解
Jan 17 Python
python爬虫请求库httpx和parsel解析库的使用测评
May 10 Python
windows安装python超详细图文教程
May 21 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版(2)
2006/10/09 PHP
linux php mysql数据库备份实现代码
2009/03/10 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
实现PHP多线程异步请求的3种方法
2014/01/17 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
php 如何禁用eval() 函数实例详解
2016/12/01 PHP
PHP对象相关知识总结
2017/04/09 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
JS 面向对象的5钟写法
2009/07/31 Javascript
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
js修改地址栏URL参数解决url参数问题
2012/12/15 Javascript
javascript和jquery修改a标签的href属性
2013/12/16 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
2014/12/18 NodeJs
vue中component组件的props使用详解
2017/09/04 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
ajaxfileupload.js实现上传文件功能
2019/04/19 Javascript
Angular单元测试之事件触发的实现
2020/01/20 Javascript
jQuery实现的分页插件完整示例
2020/05/26 jQuery
详解javascript脚本何时会被执行
2021/02/05 Javascript
Python实现解析Bit Torrent种子文件内容的方法
2017/08/29 Python
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
2019/03/30 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
python路径的写法及目录的获取方式
2019/12/26 Python
C有"按引用传递"吗
2016/09/06 面试题
艺术设计专业个人求职信
2013/09/21 职场文书
高二政治教学反思
2014/02/01 职场文书
班班通项目实施方案
2014/02/25 职场文书
2014年招商工作总结
2014/11/22 职场文书
公司财务管理制度
2015/08/04 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android