网络 安全基础知识.md
本文最后更新于:2024年5月10日 下午
网络安全
在介绍HTTPS协议之前,因该先了解网络安全的知识,这样才能知道为什么HTTP协议升级为HTTPS协议。
网络安全问题概述
计算机网络通信主要面临两大类威胁,即主动攻击与被动攻击
被动攻击指:攻击者从网络上窃取他人通信内容,通常称为截获。被动攻击中,攻击者只是观察和分析某一个协议数据单元PDU而不干扰信息流,主要通过观察协议控制信息部分了解正在通信的协议实体地址和身份、研究PDU的长度和传输的频度,也称流量分析。
主动攻击有以下几种形式:
- 篡改:恶意篡改网络上传送的报文
- 恶意程序:计算机病毒;计算机蠕虫;特洛伊木马;逻辑炸弹;后门入侵;流氓软件等
- 拒绝服务DoS:指攻击者不停向服务器发送大量分组,使该服务器无法正常工作
对于主动攻击可以采取措施检测,被动攻击通常检测不出来,根据这些特点可以得出计算机网络通信安全的目标如下:
- 防止析出报文内容和流量分析
- 防止恶意程序
- 检测更改报文流和拒绝服务
- 采用加密技术对服被动攻击;将加密技术和鉴别技术结合对服主动攻击
一个安全的计算机网络应该达到以下四个目标:
- 保密性
- 端点鉴别
- 信息的完整性
- 运行安全性
数据加密模型
一般加密模型如下图,用户A向用户B发送明文X,通过加密算法E运算后,得到密文Y。
加密解密所用的密钥K(Key)是一串秘密的字符串。在接收端使用解密算法D运算和解密密钥K,解出明文X。
解密算法是加密算法的逆运算,如果解密时不采用事先约定好的密钥就无法解密出明文。

两类密码体制
密码学分为:密码编码学、密码分析学。如果截获者无论获取多少密文都不能找到足够的信息来唯一确定对应明文,则称这一密码体制是无条件安全的(或理论上不可破的)
对称密钥密码体制
所谓对称密钥密码体制,即加密密钥和解密密钥是使用相同的密码体制,上面加密模型图就是采用这种。
数据加密标准DES属于对称密钥密码体制,由IBM研制。DES是一种分组密码,在加密前将整个明文分组,每组为64位长的二进制数据;然后对每一个64位二进制数据进行加密处理,产生一组64位密文数据;最后将各组密文串接得到整个密文,使用的密钥占64位(实际密钥56位,奇偶校验位8位)
DES的保密性取决于对密钥的保密,而算法是公开的。DES的问题是密钥长度是56位,即有2^56中可能密钥。但是现在的计算机是可以搜索破解的。因此有学者提出了三重DES方法:将一个64明文用一个密钥加密,再用另一个密钥解密,再用另一个密钥加密 *Y=DES k1(DES-1 k2( DESk3(X)))*;
公钥密码体制
公钥密码体制是由斯坦福大学的研究人员Diffie与Hellman提出的。公钥密码体制使用不同的加密密钥和解密密钥
产生原因:
- 对称密钥密码体制的密钥分配问题
- 由于对数字签名的需求
目前最著名的是美国三位科学家Rivest、Shamir、Adleman提出的RSA体制,它是一种基于数论中的大数分解问题的体制。
在公钥密码体制中,加密密钥*PK(Primary Key)是向公众公开的,解密密钥SK(Secret Key)*则是要保密的,加密算法E和解密算法D也是公开的。
公钥密码体制加密解密过程特点:
- 密钥对产生器产生出接收者B的一对密钥:加密密钥PKB和解密密钥SKB。发送者A所用的加密密钥PKB就是接收者B的公钥,它向公众公开,而B所用的解密密钥SKB就是接收者B的私钥,对别人保密。
- 发送者A用B的公钥PKB通过E运算对明文X加密,得出密文Y,发送给B。Y = E PKB ( X )
- B用自己的私钥SKB通过D运算进行解密,恢复出明文。D SKB( Y ) = D SKB( E PKB ( X ) ) = X
- 虽然在计算机上很容易生产成对的PKB和SKB,但是由已知的PKB推导出SKB属实“计算上不可能的”
- 公钥可以用来加密,但是不能用来解密。D PKB( E PKB ( X ) ) 不等于 X
- 先对X进行D运算再E运算,和先E运算再D运算结果是一样的

对称密钥中双方使用相同的密钥,可以实现通信信道上的一对一双向保密通信;公开密钥中通信信道上可以实现双方多对一的单向保密通信
数字签名
数字签名功能:
- 报文鉴别:接收者能何时发送者对报文的签名,即确认发送者信息。
- 报文完整性:接收者确信接收的数据与发送者发送是完全一致未被篡改的。
- 不可否认:发送者事后不能抵赖对报文的签名。
现在已经有多种实现数字签名的方法,其中采用公钥算法更容易实现。
为进行签名,A用其私钥SKA对报文X进行D运算(此处的D运算并非指解密运算),得到不可读的密文,将密文传送给B。B为了核实签名,用A的公钥PKA进行E运算还原出明文X(注:任何人用A的公钥进行E运算后都可以得到A发送的明文)。这里的通信不是为了保密,而是为了签名和核实签名,即确认发送者信息

上述功能分析:
- 由于除A外没有人拥有A的私钥SKA,那么除了A就没人能产生密文DSKA(X)。这样B就能相信X是A签名发送的,这就是报文鉴别功能
- 同理,其他人若篡改报文,但由于没有A的私钥SKA来对X进行加密,那么B对篡改后的报文解密时将会得到不可读的明文,由此知道报文被篡改过了,这就是报文完整性
- 若A抵赖发送过报文给B,B可以将明文X和密文DSKA(X)出示给公证的第三者,第三者很容易用PKA去证实A确实发送过保温给B,这就是不可否认。
上述过程中A仅对报文签名,未对报文保密,因此接获到密文DSKA(X)后,可以通过查手册知道公钥PKA从而知道报文内容X。可以使用A、B两者的公钥实现保密和签名

鉴别
鉴别(Authentication)是网络安全中非常重要的一个话题。鉴别与加密不同。鉴别是要验证通信的对方确实是自己所要通信的对象,而不是其他冒充者,并且所传送的报文是完整的,未被篡改过。
报文鉴别
1.密码散列函数
理论上讲上述的签名就可以实现对报文的鉴别,不过这种方法很大的一个缺点就是对较长的报文进行数字签名会是计算机负担增大很多,因此需要一个相对简单的方法——密码散列函数。前面所讲过的校验和其实就是散列函数的一种应用。散列函数有如下特点:
(1)散列函数的输入长度可以很长,但是输出长度是固定的,并且较短。散列函数的输出值叫做散列值,简称散列
(2)不同散列值肯定对应于不同输入,但是不同输入可能会有相同散列值。即散列函数的输入和输出是多对一的
密码散列函数最重要的特点:要找到两个不同的报文,使得他们的散列密码输出相同,在计算上是不可行的

2.实用密码散列函数MD5和SHA-1
最出名的密码散列函数MD5和SHA-1。以MD5为例,算法大致过程如下:
- 先把任意长度的报文按模264计算余数,追加在报文后面
- 在报文和余数之间填充1~512位,使得填充后的总长度是512的整数倍。填充的首位是1后面全0
- 把追加的和填充的报文分割为一个个的512位数据块,每512位报文数据再分成4个128位的数据块送到不同散列函数进行4轮计算,每一轮又按32位小数据块进行运算,直到最后计算出MD5报文摘要代码(128位)
这样得出的MD5报文摘要代码的每一位都与原报文的每一位有关!
SHA和MD5相似,但是码长为160位(比MD5的128位多了25%),也是用512位长的数据块运算得出
3.报文鉴别码
接下来说说怎样在报文鉴别中用散列函数,基本步骤:
用户A根据自己的明文X计算出散列*H(X)*。为方便起见称其H1。
用户将散列H拼接在明文X后面,生成了拓展的报文*(X,H1)*,然后发送给B。
B收到拓展的报文,由于散列长度是已知的固定值,因此可将散列H1和明文X分开。B、通过散列函数运算,计算出收到的明文X的散列H2(X),若H2=H1似乎就可以相信是A发送的,但是这是不行的(有可能攻击者伪造了一个报文M,同样计算出H2(X)后,再将拼接有散列的拓展保温发送给B,B收到拓展保温(M,H2(X) )后验证发现正常,就会出现错误!)
解决方法就是对散列进行一次加密
实体鉴别
报文鉴别是对每一个报文都要鉴别报文发送者,而实体鉴别是在系统接入的全部持续时间内对和自己通信的对方实体进行一次验证即可
最简单的过程:A像远端B发送带有自己信息和口令的报文,并约定双方使用共享对称密钥KAB加密。

这样的方法有很明显的漏洞:攻击者C可以截获A发送的报文,不需要破译,而是直接将其发送给B,使得B误认为C的身份是A,然后B向C发送本该发送给A的报文。这就叫**重放攻击(replay attack)**,C甚至还可以截获A的IP地址将其冒充为自己的IP(IP欺骗),使B更容易受骗。
为对付重放攻击,可以使用不重数,即一个不重复使用的大随机数

A用明文发送身份A和一个不重数RA给B。B响应A的查问,用共享密钥KAB对RA加密后发回A,同时也给出自己的不重数RB。最后A响应B的查问,用共享密钥KAB对RB加密后发回B。(注:A与B在不同对话中必须使用不同的不重数)由于不重数不能重复使用,C在重放攻击时就无法重复使用截获的不重数
即使这样,还是会有收到攻击的可能,常见的就是中间人攻击
密钥分配
由于密码算法是公开的,网络的安全性就完全基于密钥的保护上,因此产生了一个重要分支——密钥管理。主要包括密钥的产生、分配、注入、验证和使用
1.对称密钥分配
假设n个人中两两都有通信,那么就要n(n-1)/2个密钥,接近n2情况,n很大时密钥数量就会非常大
目前常用的密钥分配方式是密钥分配中心KDC(Key Distribution Center)。基本流程:
- A向KDC发送明文,说明想和B通信,并给出A、B在KDC登记的身份
- KDC用随机数产生”一次一密”的会话密钥KAB,向A发送回答报文(用KA加密),报文包括本次会话使用的密钥KAB和请A转给B的票据(ticket),票据包含A、B在KDC等级的身份以及会话密钥(票据用KB加密)A无法知道票据内容。
- B收到A转发来的票据后使用KB解密,就知道A要和自己通信,也知道了KDC为此次会话分配的密钥KAB
- A、B就可以开始通信了
注:在网络上传送的密钥都是经过加密的。KDC还可以在报文中加入时间戳,以防止报文截取这利用以前记录的报文进行重放攻击。
目前最出名的密钥分配协议是Kerberos V5。由MIT开发,Kerberos既是鉴别协议也是KDC
2.公钥分配
在公钥密码体制中,使用**认证中心CA(Certification Authority)来将公钥与对应实体绑定(binding)**,它一般由政府出资建立。
在IE浏览器中,选择工具/Internet选项/内容/证书。即可查看有关证书发行机构的信息。