网络安全问题概述
计算机网络上的通信面临以下两大类威胁:
- 被动攻击。主要是截获,即从网络上窃听他人的通信内容。
- 主动攻击,主要有:
- 篡改——故意篡改网络上传送的报文。
- 恶意程序—— 包括计算机病毒、蠕虫、木马和逻辑炸弹等。
- 拒绝服务——包括分布式拒绝服务。
PS: 哈哈哈? 说到逻辑炸弹,我就想到了西门子前员工设置的逻辑炸弹,看新闻
然后我想说说计算机病毒、蠕虫、木马的区别(其实区分也没这么严格)
- 病毒:计算机病毒是一段代码,能把自身加到其它程序包括操作系统上。它不能独立运行,需要由它的宿主程序运行来激活它
- 蠕虫:可以从一台计算机移动到另一台计算机和可以自我复制
- 木马:指隐藏在正常程序中的一段具有特殊功能的恶意代码,是具备破坏功能的后门程序。(那么大公司的收集隐私的行为也算得上木马了?)
概念
主要通过以下几个方面来保障安全:
- 保密性
- 安全协议的设计
- 访问控制
如果不论截取者获得了多少密文,但在密文中都没有足够的信息来唯一地确定出对应的明文,则 这一密码体制称为无条件安全的,或称为理论上 是不可破的。
如果密码体制中的密码不能被可使用的计算资源 破译,则这一密码体制称为在计算上是安全的。
两类密码体制
对称密钥密码体制
所谓常规密钥密码体制,即加密密钥与解密密钥是相同的密码体制。这种加密系统又称为对称密钥系统。
数据加密标准 DES
数据加密标准 DES 属于常规密钥密码体制,是 一种分组密码。 在加密前,先对整个明文进行分组。每一个组长为 64 位。 然后对每一个 64 位二进制数据进行加密处理, 产生一组 64 位密文数据。 最后将各组密文串接起来,即得出整个的密文。 使用的密钥为 64 位(实际密钥长度为 56 位, 有 8 位用于奇偶校验)。
是不是看不懂,看不懂正常,我只不过随便贴张图。图源 @GeneralAndroid
DES 的保密性仅取决于对密钥的保密,而算法是公开的。尽管人们在破译 DES 方面取得了许多进展,但至今仍未能找到比穷举搜索密钥更有效的方法。(其实破解的方法比较就比谁搜的快,貌似密钥攻击算法美国是严禁出口到其他国家,除了加拿大)
一个简单的python程序如下
from pyDes import des, CBC, PAD_PKCS5
import binascii
# 秘钥
KEY='mHAxsLYz'
def des_encrypt(s):
"""
DES 加密
:param s: 原始字符串
:return: 加密后字符串,16进制
"""
secret_key = KEY
iv = secret_key
k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
en = k.encrypt(s, padmode=PAD_PKCS5)
return binascii.b2a_hex(en)
def des_descrypt(s):
"""
DES 解密
:param s: 加密后的字符串,16进制
:return: 解密后的字符串
"""
secret_key = KEY
iv = secret_key
k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
de = k.decrypt(binascii.a2b_hex(s), padmode=PAD_PKCS5)
return de
if __name__ == '__main__':
s='123456789987654321'
enc=des_encrypt(s)
print(enc)
des=des_descrypt(enc)
print(des)
公钥密码体制(非对称密码算法)
公钥密码体制使用不同的加密密钥与解密密钥,是一种“由已知加密密钥(公钥)推导出解密密钥(密钥)在计算上是不可行的”密码体制。
现有最著名的公钥密码体制是RSA 体制, 它基于数论中大数分解问题的体制,由美国三位科学家 Rivest, Shamir 和 Adleman 于 1976 年提出并在 1978 年正式发表的。
在公钥密码体制中,加密密钥(即公钥) PK 是公开信息,而解密密钥(即私钥或秘钥) SK 是需要保密的。加密算法 E 和解密算法 D 也都是公开的。虽然秘钥 SK 是由公钥 PK 决定的,但却不能根据 PK 计算出 SK。
由于目前公钥加密算法的开销较大,在 可见的将来还看不出来要放弃传统的加密方法。公钥还需要密钥分配协议,具体的分配过程并不比采用传统加密方法时更简单。
特点
发送者 A 用 B 的公钥 $PK_B$ 对明文 X 加密(E 运算)后,在接收者 B 用自己的私钥 $SK_B$ 解 密(D 运算),即可恢复出明文:
$$
D_{S K_{\mathrm{B}}}(Y)=D_{S K_{\mathrm{B}}}\left(E_{P K_{\mathrm{B}}}(X)\right)=X
$$
解密密钥是接收者专用的秘钥,对其他人都保密。加密密钥是公开的,但不能用它来解密,即
$$
D_{P K_{\mathrm{B}}}\left(E_{P K_{\mathrm{B}}}(X)\right) \neq X
$$
可以服务端有一个私钥,然后给每一个用户一个公钥,可以保障交易的安全。加密和解密的运算可以对调,即:
$$
E_{P K_{B}}\left(D_{S K_{B}}(X)\right)=D_{S K_{B}}\left(E_{P K_{B}}(X)\right)=X
$$
从已知的 PK 实际上不可能推导出 SK,即从 PK 到 SK 是“计算上不可能的”。
数字签名
- 报文鉴别——接收者能够核实发送者对报文的签名;
- 报文的完整性——发送者事后不能抵赖对报文的签名;
- 不可否认——接收者不能伪造对报文的签名。
现在已有多种实现各种数字签名的方法。 但采用公钥算法更容易实现。数字签名
实现
假设A是小明,B是小红,小明给小红传送了给他一百的借条:
- 因为除小明外没有别人能具有小明的私钥,所 以除小明外没有别人能产生这个密文。因此小红相信报文 X 是小明签名发送的。(报文鉴别)
- 若小明要抵赖曾发送报文给 小红,小红可将明文和对应的密文出示给第三者。第三者很容易用小明的公钥去证实小明确实发送给她给小红。(不可否认)
- 反之,若小红将给她一百伪造成给她两百,则小红不能在第三者前出示对应的密文(因为一开始接受到的不是给她两百)。这样就证明了小红伪造了报文。(报文的完整性)
鉴别
报文鉴别使得通信的接收方能够验证所收到的报文(发送者和报文内容、发送时间、序列等)的真伪。使用加密就可达到报文鉴别的目的。但在网络的应用中,许多报文并不需要加密。应当使接收者能用很简单的方法鉴别报文的真伪:
报文摘要 (Message Digest)
A 将报文 X 经过报文摘要算法运算后得出很短的报文摘要 H。然后然后用自己的私钥对 H 进行 D 运算,即进行数字签名。得出已签名的报文摘要 D(H) 后,并将其追加在报文 X 后面发送给 B。
B 收到报文后首先把已签名的 D(H) 和报文 X 分离。然后再做两件事:
- 用 A 的公钥对 D(H) 进行 E 运算,得出报文摘要 H 。
- 对报文 X 进行报文摘要运算,看是否能够得出同样的报文摘要 H。如一样,就能以极高的概率断定收到的报文是 A 产生的。否则就不是。
实体鉴别
报文鉴别是对每一个收到的报文都要鉴别报文的发送者,而实体鉴别是在系统接入的全部持续时间内对和自己通信的对方实体只需验证一次。
最简单的实体鉴别过程
A 发送给 B 的报文的被加密,使用的是对称密钥 $K_{AB}$ 。B 收到此报文后,用共享对称密钥 $K_{AB}$ 进行解密,因而鉴别了实体 A 的身份。
但这有个明显的漏洞:入侵者 C 可以从网络上截获 A 发给 B 的报文。 C 并不需要破译这个报文而可以直接把这个由 A 加密的报文发 送给 B,使 B 误认为 C 就是 A。然后 B 就向伪装是 A 的 C 发送应发给 A 的报文。这就叫做重放攻击 (replay attack)。
使用不重数
为了对付重放攻击,可以使用不重数 (nonce)。不重数就是一个不重复使用的大随机数,即“一次一数”。在摘要认证中服务器让客户选一个随机数(称作”nonce“),然后浏览器使用一个单向的加密函数生成一个消息摘要(message digest),该摘要是关于用户名、密码、给定的nonce值、HTTP方法,以及所请求的URL。
中间人攻击
在公用密钥加密中,公钥密钥是以电子形式发表的,或是通信各方通过交换得到的话,那么攻击者就能够在这些密钥传递给接收者的过程中进行篡改。当两方打算进行通信时,攻击者截获他们的密钥,并代之再将自己的密钥发送给每一方。这样每一方都会按照攻击者的要求来进行加密,而攻击者根据真正的接收者重新进行加密,这被称作中间人攻击(man-in-the-middle-attack)。然而,如果将密钥以物理方式印刷出来,则很不方便。
密钥分配
对称密钥的分配
目前常用的密钥分配方式是设立密钥分配中心 KDC (Key Distribution Center)。KDC 是大家都信任的机构,其任务就是 给需要进行秘密通信的用户临时分配一个会话密钥(仅使用一次)。
公钥的分配
需要有一个值得信赖的机构——即认证中心 CA (Certification Authority),来将公钥与其对应的实体(人或机器或者网站)进行绑定。
认证中心一般由政府出资建立。每个实体都有 CA 发来的证书 (certificate),里面有公钥及其拥有者的标识信息。此证书被 CA 进行了数字签名。任何用户都可从可信的地方获得认证中心 CA 的公钥,此公钥用来验证某个公钥是否为某个实体所拥有。有的大公司也提供认证中心服务。
因特网使用的安全协议
网络层协议
IPsec 协议
网络层保密是指所有在 IP 数据报中的数据都是加密的。(其他的不管了)
运输层安全协议
- 安全套接字层 SSL (Secure Socket Layer)
- 运输层安全 TLS (Transport Layer Security) 。
SSL安全会话建立过程如下
应用层的安全协议
PGP 协议
A 有三个密钥: 自己的私钥、B的公钥和自己生成的一次性密钥。
B 有两个密钥: 自己的私钥和A的公钥。
加密过程如下:
解密过程如下:
防火墙与入侵检测
防火墙
防火墙是由软件、硬件构成的系统,是一种特殊编程的路由器,用来在两个网络之间实施接入控制策略。接入控制策略是由使用防火墙的单位自行制订的,为的是可以最适合本单位的需要。
防火墙内的网络称为“可信的网络 ”(trusted network),而将外部的因特网称为“不可信的网络 ”( untrusted network)。
入侵检测系统
入侵检测系统 IDS (Intrusion Detection System) 能够在入侵已经开始,但还没有 造成危害或在造成更大危害前,及时检 测到入侵,以便尽快阻止入侵,把危害降低到最小。基于特征的 IDS 维护一个所有已知攻击标志性特征的数据库。基于特征的IDS只能检测已知攻击,对于未知攻击则束手无策。