网络安全相关的一些学习笔记
网络安全?
本文主要为《计算机网络》网络安全章节的学习笔记,也包括部分来自其他博客与网站的段落。
1. 一些名词解释
密码编码学(cryptography):密码体制的设计学
密码分析学(cryptanalysis):在未知密钥的情况下从密文推演出明文或密钥的技术
上述二者合称密码学(cryptology)
无条件安全(理论上不可破):密文中没有足够的信息来唯一地确定出对应的明文的密码体制。
事实上这是不可能的,目前所有密码体制理论上都是可被破解的,密码体制的设计目标是“不可以计算”,只要计算难度足够大,那么就认为是安全的。
这被成为计算上是安全的
数据加密标准:DES(Data Encryption Standard)
公钥密码体制(公开密钥密码体制):public key crypto-system
2. 两类密码体制
2.1. 对称 symmetric
加密和解密使用同一个密钥。
一般说到对称加密算法,常见的是DES(Data Encryption Standard)和AES(Advanced Encryption Standard)。
2.1.1. DES
DES由IBM提出,1977年被美国定位联邦信息标准。
算法使用64位密钥(其中有效位为56,其余8位用于奇偶校验),加密时对原文先进行分组。64位一组,每组单独加密。这样分组进行加密的算法有个称呼“分组密码”。
由于被设计出了专用于计算DES的芯片,可以在有限的时间内破译出56位DES密钥,DES的56位密钥长度已经被证明不够安全,但是有大量学术资料证明该算法没有设计缺陷。
针对安全性的下降,学者提出了三重DES(Triple DES or 3DES)
2.1.1.1 Triple DES
通过做三次DES加密提高密钥被破解的难度,密钥有三种选项:
- 三个独立的密钥\(K_1\), \(K_2\), \(K_3\)
- 两个密钥\(K_1\), \(K_2\), \(K_3 = K_1\)
- 一个密钥(兼容选项)\(K_1 = K_2 = K_3\)
不管是哪一种选项,计算时都是分三步:
- 使用\(K_1\)加密
- 使用\(K_2\)解密上一步骤得到的结果
- 使用\(K_3\)加密上一步得到的结果
上述选项虽然都是三重DES,但常用称呼如下:
3TDES
,3-Key Triple DES
2TDES
,2-Key Triple DES
第三种实际就是DES
理论上作为一种分组算法,每一组的加密方式是可以不同的,不同的标准对不同组是否使用不同的加密方式规定的细致程度不同。
2.2. 非对称 Acymmetric
2.2.1. 公钥密码体制
使用不同的密钥进行加密和解密。
使用非对称加密算法的密码体制也叫“公钥密码体制”。
这种体制主要是为了解决对称密钥密码体制的传递密钥问题,以及“数字签名”的需求。
公钥密码体制中有如下角色:
- PK public key 公钥
- SK secret key 私钥
- E 加密算法 (在数字签名中该算法用于验证签名)
- D 解密算法(在数字签名里该运算用于签名)
在公钥密码体制中,仅有私钥需要由持有人保密,其余部分都是公开的。
公钥密码体制的基本要求是难以从公钥推算出私钥。且由公钥加密的数据不能由自身作为密钥解密,只能由私钥解密。
对于对称密码体制,典型的应用场景是一对一的双向保密通信。而对于公钥密码体制,典型的应用场景是多对一的单向保密通信。公钥密码体制也可以通过两对密钥实现两个对象间的双向保密通信,但这显然是一种扩展用法,而不是体制本身的性质。
任何加密方法的安全性都取决于密钥的长度,以及攻破密钥所需的计算量。
虽然公钥密码体制有更高的安全性,但是往往开销较大,在实践中更多时候是将两种密码体制混合使用。
2.2.2. 使用公钥密码体制进行数字签名
与数字签名相关的几个概念:
- 报文鉴别:接受者可和是发送者对发送报文的签名
- 报文的完整性:接受者可以验证接受到的数据是完整的,为被篡改的
- 不可否认:发送者无法否认对报文的签名
数字签名的一般过程:
- 计算需要签名的数据的数据摘要(
Hash
),这一步主要是考虑到非对称加密算法往往开销较大且对带加密数据的长度可能存在限制,通过选择合适的Hash
算法,可以缓解这两个问题。 - 签名方使用自己的私钥对数据的
Hash
进行签名(进行D
运算) - 将数据原文和签名产生的数据发送给验签方(这里假设接收方指导签名方使用的
Hash
算法) - 接收方接收数据后对接受到的签名结果进行解密(进行
E
运算),得到被签名的Hash值 - 使用和签名方相同的
Hash
算法计算接受到的原文的Hash
,比较和上一步骤得到结果是否相同,相同则签名验证成功
如果在上述流程的第三步中,使用发送方的公钥对要发送的报文加密,且验签方接受后使用自己的私钥解密,那这就是一个完全具有保密性的签名和验证签名的过程。
此处需要强调的是,上述过程中,如果是使用非对称加密算法直接加密数据,而省略所有与Hash
算法相关的部分,仍旧是符合数字签名的定义的。
2.2.3. 密码散列函数
数字签名解决的是网络应用中的鉴别(Authentiucation)问题。
鉴别是要验证通信的对方是自己所要通信的对象,且传输内容没有被篡改。
数字签名实现了对通信对象的识别,而㪚列函数(Hash算法),解决的就是对报文完整性的验证。
这里更加专业的名词是“密码散列函数(cryptographic hash function)”。
密码散列函数是一个较为宽泛的概念,密码学领域中使用的散列函数被称为密码散列函数。
散列函数具有以下特点:
- 函数的运算结果的长度是固定的,并且相对来说较短,一般将这一输出称为散列值或者数据摘要(message digest)
- 散列函数的输入与输出不是一一对应的。
密码学中需要的散列函数需要具有难以从散列值推算出原始报文且难以找到一个另一个拥有相同散列值的报文。这样就可以用散列值作为验证数据是否完整,是否为原始报文的手段。
校验和也是一种散列函数的应用,但由于它很容易找到另一个拥有相同散列值的报文,所以一般只用作校验数据完整性,无法用于验证数据是否被修改。
常用的密码散列函数有:
- MD5
- SHA-1
- SHA-2
MD5公布于1991年,产生的散列值为128位,虽然现在已经被证明不够安全,但还是大量用于验证数据的完整性。
SHA是美国标准与技术协会(NIST)提出的一系列散列算法。将SHA-1单独列出是由于该算法同样已经被证明不够安全,即将被SHA-2和SHA-3取代,但算法的替换是一个漫长的过程。
比起SHA-2,更常见到的可能是SHA-256或者SHA-512。这些其实都是SHA-2算法,-
符号后的数字表示的是算法产生的散列值的位数。
2.2.4. 报文鉴别码(MAC message authentication code)
对报文数据的散列值进行加密就可以得到报文鉴别码。报文鉴别码的生成及验证就是“数字签名”的签名和核实。
2.2.5. 实体鉴别
实体鉴别指的是在一次会话中只验证一次。实体鉴别如果进行鉴别时的数据被截获并使用伪造的鉴别数据取代,其中一方就会将攻击者视为预期的对象。要避免这种情况可以使用以下鉴别流程:
2.2.6. RSA
是由三位美国科学家Rivest,Shamir和Adleman共同提出并发表的,RSA
取自他们三人名字的首字母。
RSA算法的密钥通过三个大数组成:
- n,模数,由生成密钥时选择的p和q参数相乘得到
- e,公钥指数,现代算法中该值生成时选定,一般为3或65537,在RSA论文中采用的算法是通过d参数求得
- d,私钥指数,通过对p,q和e三个值作一系列运算后得出
最终公钥由(n,e)
组成,私钥由(n,d)
组成。现代算法库会通过中国余数定理优化计算,生成密钥时会预先计算几个值用于简化加密和解密的运算。
TODO: 欧拉函数?具体计算原理?
2.2.7. 使用openssl生成密钥对
生成没有加密的密钥信息文件。
# 生成1024bit, E值为0x010001 openssl genrsa -F4 -out ./test_rsa_key_pair.pem 1024 # 导出 PEM 格式的 public key openssl rsa -in ./test_rsa_key_pair.pem -pubout -out ./test_rsa_key_public.pem # 导出 RSAPublicKey 格式的 public key openssl rsa -in ./test_rsa_key_pair.pem -RSAPublicKey_out -out ./test_rsa_key_RSAPublicKey
官方文档:https://www.openssl.org/docs/man1.0.2/man1/openssl-rsa.html
2.2.6.1 不同环境下的RSA参数
C# RSAParameters | PKCS#1 | Contains | Note |
---|---|---|---|
D | privateExponent | d,the private exponent | 由p和q经过一系列运算得到的私钥指数,用于解密 |
DP | exponent1 | d mod (p-1) | 为了加速运算而预先计算的值 |
DQ | exponent2 | d mod (q - 1) | 为了加速运算而预先计算的值 |
Exponent | publicExponent | e, the public exponent | 公钥中的指数,一般生成密钥时指定 |
InverseQ | coefficient | \(q^{-1}\) (mod p) | 为了加速运算而预先计算的值 |
Modulus | modulus | n | p和q的乘积,用作公钥与私钥的模数 |
P | prime1 | p | 素数, 与q应当由较大的差 |
Q | prime2 | q | 素数 |
3. 密钥管理
在公开加密算法的前提下,网络安全建立在密钥的完全之上。
密钥管理包括密钥的产生、分配、注入、验证和使用。
3.1. 密钥分配
3.1.1. 对称密钥的分配
目前常用的分配方式是设置密钥分配中心KDC(Key Distribution Center)。KDC是受信任的机构,为需要进行秘密通信的对象分配一个一次性的密钥。
目前最出名的对称密钥分配协议是Kerberos V5
,Kerberos
既是鉴别协议,也是KDC。使用AES进行加密。
3.1.2. 非对称公钥的分配
对于公钥体系,如何确认公钥与确实来自某实体非常重要。为了解决这个问题,需要引入第三方机构CA(Certification Authority),它一般由政府出资建立。
CA机构的责任是为证书(certificate)签名,证书中会包含公钥、公钥所有者的标识信息以及来自CA机构的数字签名。
证书的使用者通过CA机构的公钥校验公钥证书中的数字签名,校验成功则代表证书中的公钥所有者信息真实可信。
3.1.2.1. 证书协议标准 X.509
该标准和一些主流的密钥格式一样,使用ASN.1(Abstract Syntax Notation)
描述。
ASN.1是一种专用于描述文件或者数据格式的“语言”,独立于任何变成语言。
ASN.1具有多种编码,最常见的可能是BER(Basic Encoding Rules)和DER(Distinguished Encoding Rules),DER是BER的扩展。这里说的编码指的是将ASN.1的内容转换为二进制数据的编码方式。
使用Openssl命令行工具生成rsa密钥时,默认格式是一种PEM格式,该格式本质上是对DER编码的二进制数据进行了Base64编码,并添加了文件头尾。
Openssl命令行工具可生成和解析如下几种格式
- PEM私钥格式文件(同PKCS#1),实际上是密钥对,包含所有私钥与公钥的信息
-----BEGIN RSA PRIVATE KEY----- (Base64 code) -----END RSA PRIVATE KEY-----
- PKCS#8私钥格式
-----BEGIN PRIVATE KEY----- -----END PRIVATE KEY-----
- PEM公钥格式文件,PKCS#8公钥格式
-----BEGIN PUBLIC KEY----- -----END PUBLIC KEY-----
- PEM RSAPublicKey PKCS#1公钥格式
-----BEGIN RSA PUBLIC KEY----- -----END RSA PUBLIC KEY-----
更多参考博客:
4. 互联网使用的安全协议
4.1. 网络层安全协议
IPsec是什么?它是一个在IP层提供互联网安全的协议族。IPsec是一个框架,它允许通信双方选择合适的算法和参数。
协议族中的协议可以划分为三个部分:
- IP安全数据报格式的两个协议
- 鉴别首部AH(Authentication Header)
- 封装安全有效载荷ESP(Encapsulation Security Payload)
- 有关加密算法的三个协议
- 互联网密钥交换IKE(Internet Key Exchange)
ESP协议包含了AH的功能,使用ESP协议就不需要使用AH协议。使用其中任意一种协议的IP数据报被称为IP安全数据报(IPsec数据报)。
IP安全数据报有两种工作方式:
- 运输方式 transport mode 在整个运输层报文段的前后添加控制信息,再加上IP首部
- 隧道方式 tunnel mode 在原始IP数据报的前后添加控制信息,再添加新的IP首部
隧道方式使用的最多。所谓的安全数据报指的是数据报中的有效载荷(payload)是经过加密的。
4.1.1. 安全关联 Security Association
要发送IP安全数据报之前,需要建立一条在网络层上的逻辑连接,这种逻辑连接是单向的。这一连接就是安全关联SA。此时原本无连接的网络层就本成了具有逻辑连接的层。(?)
在SA上传输的是IP安全数据报。
SA有如下状态信息需要建立者维护:
- 32位连接标识符安全参数索引SPI(Security Parameter Index)
- 安全关联源点和终点的IP地址
- 使用的加密类型(算法)
- 加密所使用的密钥
- 完整性检查的类别(数据摘要的算法等)
- 鉴别所使用的密钥(验证签名的公钥等)
4.1.2. 安全关联数据库 SAD Security Association Database
顾名思义,SAD存放SA的相关信息,当主机需要发送安全数据报时先在SAD中查找相关的SA。接受时同样需要查找相关信息,才能对接受到的数据报进行验证。
4.1.3. 安全策略数据库 SPD Security Policy Database
SPD负责确定什么数据报需要通过IPsec处理。
4.1.4. 互联网密钥交换协议 IKE Internet Key Exchange
当系统较为复杂时,人肉构建和维护SAD是较为困难的,使用IKE协议来自动生成SAD。
IKEv2以其他三个协议为基础:
- Oakley 密钥生成协议
- 安全密钥交换机制 SKEME(Secure Key Exchange Mechanism) 用于密钥交换,该协议通过公钥加密来实现密钥交换中的实体鉴别
- 互联网安全官两和密钥管理协议ISAKMP(Internet Secure Association and Key Management Protocol) 用于实现IKE中定义的密钥交换,使IKE的交换能够以标准化、格式化的报文创建安全关联SA。
IKE相关文档RFC4945和RFC7427
4.2. 运输层安全协议
运输层广泛使用的协议由两个:
- SSL Secure Socket Layer 安全套接字层
- TLS Transport Layer Security 运输层安全
TLS是由SSL发展而来,现在互联网应用中基本都是TLS,且在不严谨的上下文中(比如这篇笔记),SSL和TLS指的是一个东西。
SSL的作用是在系统应用层的HTTP和运输层之间建立起安全通道,为通过TCP传输的数据提供安全保障。SSL增强了TCP服务,所以从分类上来说应当属于运输层协议,但是使用SSL的应用程序把SSL在应用层实现,此时,SSL实际上是在应用层中作为一个子层,通过SSL套接字向应用程序提供编成接口API。
HTTP通过SSL就成为了HTTPs,浏览器会对使用HTTPs的网页作出标注,此时使用的TCP连接端口号为443,而不是平时的80。
使用SSL最知名的应用程序就是HTTP,但理论上可以通过SSL为任意应用程序提供安全通信的功能。
SSL协议提供三种安全服务:
- SSL服务器鉴别,允许用户证实服务器身份。支持SSL的客户端通过验证来自服务器的证书,来鉴别服务器的真实身份并获得服务器的公钥。
- SSL客户鉴别,可选的安全服务,允许服务器证实客户端的身份
- 加密会话,对客户端和服务端之间的所有报文进行加密,并检测报文完整性。
SSL简要过程:
- 协商加密算法
- 服务器鉴别,服务器向客户端发送包含公钥的数字证书,客户端通过CA验证证书
- 会话密钥计算,客户端随即产生一个随机数,通过服务器公钥加密后发送给服务器,双方更具协商的算法产生对称加密密钥
- 安全数据传输
一个SSL建立安全会话的简要过程:
4.3. 应用层安全协议
4.3.1. PGP Pretty Good Privacy
这是一个完整的电子邮件安全软件包,通过将对称加密、非对称加密以及数据摘要算法相组合,实现电子邮件的安全传输。
PGP不是互联网正式标准,但由于使用广泛,已成为事实标准。
4.4. 防火墙和入侵检测
4.4.1. firewall
是一种访问控制技术,通过控制进出网络边界的“分组”(在计算机网络的语境下,就是指IP数据报),禁止不必要的通信,降低安全风险。
防火墙技术一般分两类:
- 分组过滤路由器是一种具有分组过滤功能的路由器,它根据过滤规则对进出内部网络的分组执行转发或丢弃,实现过滤。过滤规则是根据分组的网络层或运输层的数据报首部信息。分组过滤可以是无状态的,也可以是有状态。但是无法对高层数据进行过滤,无法禁止某个用户对某个应用进行特定操作,不能支持应用层用户鉴别等。
- 应用网关,也称为代理服务器(proxy server)。在应用层中扮演报文中继的角色,所有进出网络的应用都需要通过应用网关,应用网关在应用层查看报文是否合法。
上述两种也常共同使用。
以防火墙为界限,一般称防火墙内部为可信的网络(trusted network),外部的网络为不可信的网络(untrusted network)。
4.4.2. IDS Intrusion Detection System 入侵检测系统
该系统通过对进入网络的分组进行深度分析与检测,目的是对疑似入侵行为作出报警。
入侵检测一般可以分为基于特征的入侵检测和基于异常的入侵检测两种。
基于特征的检测方式只能检测已知的攻击,基于异常的检测方式通过观察正常运行的网络流量,学习正常流量的统计特性和规律,当检测到网络中流量的某种统计规律不符合正常情况时,则认为可能发生了入侵行为。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)