太实用了!自己动手写软件——邮件用户名密码验证
我们计划实现的弱口令破解软件一共支持如下四类协议的解析:
- 数据库类——MySQL、Oracle和SQL server
- 邮件类——IMAP、POP3和SMTP
- 文件传输类——FTP
- 运维类——SSH
数据库类我们之前的文章就已经讲过了,详细可以查看这两篇文章(Python连接MySQL数据库和python使用cx_Oracle库连接oracle服务器)
今天我们就来看看第二类——邮件协议的解析。
邮件协议介绍
作为知识储备,我们首先可以了解一下一封邮件的从发件人到收件人的简单分析过程。
- 发件人A写好一封邮件,通过SMTP协议发送到SMTP服务器上
- 收件人B定时从邮件服务器上通过POP3协议或者IMAP协议下载发件人A发出来的邮件
简单来说SMTP负责发邮件,POP3或者IMAP负责收邮件。那POP3和IMAP都是收邮件的话,二者有什么区别呢?
最简单的解释,POP3只是单向地从邮件服务器下载邮件,不会将下载后的邮件状态再同步给邮件服务器;IMAP和邮件服务器之间是双向的通信过程,除了收邮件以外,还会将客户端上对邮件的操作(如:移动邮件到另外一个文件夹)同步到邮件服务器上。
SMTP协议
python内置的smtplib对SMTP协议进行了简单的包装,就完全可以实现我们验证用户名密码的操作(发送邮件只需要将注释的代码去掉注释即可),具体代码如下:
import smtplib
print("=======破解SMTP协议========")
user="1*********8@163.com"
password="1***X"
try:
smtpObj = smtplib.SMTP(timeout=30)
smtpObj.set_debuglevel(0)
smtpObj.connect('smtp.163.com', 25) # 25 为 SMTP 端口号
smtpObj.login(user, password)
print(f"用户名:%s,密码:%s登录成功n"%(user, password))
except smtplib.SMTPException:
print(f"用户名:%s,密码:%s无法登录成功n" % (user, password))
我们用于验证邮箱密码的代码比较简单,从代码中看出我们要验证SMTP用户名密码需要四个参数:服务器地址、服务器端口、用户名和密码。输出用户名密码的验证结果
POP3协议
POP3协议我们使用的是poplib库,具体代码如下:
import poplib
print("=======破解POP3协议========")
user="1*********8@163.com"
password="1***X"
try:
pop3_server = poplib.POP3("pop3.163.com",110)
pop3_server.user(user)
pop3_server.pass_(password)
print("用户名:%s,密码:%s登录成功n" % (user, password))
except:
print("用户名:%s,密码:%s无法登录成功n" % (user, password))
和SMTP协议类似,输入参数有:服务器地址、服务器端口、用户名和密码。输出用户名密码的验证结果
IMAP协议
连接IMAP协议需要我们使用pip命令安装一个imapclient第三方模块。
安装之后我们验证用户名密码的代码也十分简单
import imapclient
print("=======破解IMAP协议========")
user="1*********8@163.com"
password="1***X"
try:
imap = imapclient("imap.163.com",port=143, ssl=True)
imap.login(user, password)
print("用户名:%s,密码:%s登录成功n" % (user, password))
except:
print("用户名:%s,密码:%s登录成功n" % (user, password))
和SMTP协议类似,输入参数有:服务器地址、服务器端口、用户名和密码。输出用户名密码的验证结果
总结
我们发现,其实我们要实现的用户名密码验证功能实现是非常简单的。现在我们看看我们破解邮件协议都需要哪些输入和输出参数,便于我们后续GUI的界面设计。
协议 |
输入参数 |
输出参数 |
---|---|---|
SMTP |
服务器地址服务器端口用户名密码 |
验证结果 |
POP3 |
服务器地址服务器端口用户名密码 |
验证结果 |
IMAP |
服务器地址服务器端口用户名密码 |
验证结果 |
- pyhton-----break语句
- python unittest使用基本过程
- 基于unittest集成你的selenium2测试
- Selenium Webdriver Desired Capabilities
- 在Selenium Webdriver中使用XPath Contains、Sibling函数定位
- Python多线程Selenium跨浏览器测试
- Python Selenium设计模式-POM
- 基于Excel参数化你的Selenium2测试
- 创建你的第一个webdriver python代码
- Python Selenium Webdriver安装手册
- 工具篇 - HTTP协议报文结构及示例03
- 工具篇 - JMeter目录及关键配置分析02
- python unittest之加载及跳过测试方法和示例
- python unittest之异常测试
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浅谈keras中的keras.utils.to_categorical用法
- python 使用多线程创建一个Buffer缓存器的实现思路
- keras.utils.to_categorical和one hot格式解析
- Python OpenCV读取中文路径图像的方法
- Java如何基于wsimport调用wcf接口
- Python装饰器结合递归原理解析
- Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
- 浅谈keras通过model.fit_generator训练模型(节省内存)
- PHP实现通过文本文件统计页面访问量功能示例
- 解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
- python里的单引号和双引号的有什么作用
- 在PHP中输出JS语句以及乱码问题的解决方案
- 使用Keras中的ImageDataGenerator进行批次读图方式
- php用xpath解析html的代码实例讲解
- PHP操作路由器实现方法示例