一、对称密码
密钥配送问题:
- 通过实现共享密钥来解决
- 通过密钥分配中心来解决
- 通过Diffie-Hellman密钥交换来解决
- 通过公钥密码来解决
二、单项散列函数:
又称消息摘要函数(Message Digest Function)、哈希函数或杂凑函数;散列值也称消息摘要(Message Digest)或者指纹(Fingerprint)。
(1)性质
-
定长输出:根据任意长度的消息计算出固定长度的散列质;
-
能够快速计算出散列值:计算散列值所花费的时间必须要短;
-
抗碰撞性:哪怕只要1比特的改变,也必须有很高的概率产生不同的散列值;
3.1 强抗碰撞性:要找到散列值相同的两条不同的消息时非常困难的;
3.2 弱抗碰撞性:给定某条消息的散列值时,要找到和该条消息相同的散列值的另一条消息是非常困难的; -
单向性:无法通过散列值反算出原始消息;
(2)种类- MD5
- SHA-1、SHA-256、SHA-384、SHA-512
- RIPEMD-160
- AHS(Advanced Hash Standard)和SHA-3
(3)单向散列函数无法解决的问题
可以防篡改(确保完整性或一致性),但是无法辨别出“伪装”(无法认证),即无法确认消息来自正确的发送者,还是经第三方攻击者发出的。
三、消息认证码(Message Authentication Code,MAC)
(1)理解:
消息认证码是一种与密钥相关的单向散列函数。
(消息, 共享密钥) -> (MAC值)
(2)实现方法:
HMAC,例如HMAC-SHA1,HMAC-MD5,HMAC-SHA256.
(3)消息认证码无法解决的问题
-
对第三方证明
-
防止否认
四、数字签名
(1)包含 -
消息摘要算法
-
签名算法:RSA和ECDSA,私钥加密,公钥解密。
(2)实际应用
先针对明文应用消息摘要算法生成散列值,然后应用签名算法进行加密生成签名信息。然后,将签名信息随明文一起发送出去。
(3)性质:
防篡改、防伪装、防止否认
(4)数字签名无法解决的问题:
无法保证公钥真正属于发送者。
现在我们发现自己陷入了一个死循环——数字签名时用来识别消息篡改、伪装以及否认的,但是我们必须从没有被伪装的发送者得到没有被篡改的公钥才行。
为此,我们需要使用证书。
五、证书——为公钥加上数字签名
(1)机密性:
依靠加密算法保障,例如AES-128-CBC;
加密算法可以保证机密性,但无法保证完整性。攻击者没有密钥,虽然无法破解数据,但是可以修改密文的部分数据,然后发送给接收方。接收方通过密钥发现可以解密,但是解出来的实际已不是原文,即消息已被篡改过。
(2)完整性:
消息验证码(Message Authentication Code,MAC)算法。MAC算法有两种形式,分别是:CMC-MAC算法和HMAC算法。例如HMAC-SHA256。
通信双方需维护一个密钥,只有拥有了密钥的双方才能生成和验证MAC值。
(3)机密性+完整性
- 提供机密性和完整性的模式叫做Authentication Encryption(AE)模式,主要有:
1)Encrypt-and-MAC
2)MAC-then-Encrypt,HTTPS一般使用这种模式进行处理,例如AES-128-CBC#PKCS7-HMAC-SHA256;
3)Encrypt-then-MAC,这种是比2更安全的模式。 - AEAD加密模式
AEAD(Authentication Encryption with Associated Data)模式在底层组合了加密算法和MAC算法,能够同时保证数据机密性和完整性。AEAD的作用类似Encrypt-then-MAC。
主要有三种模式:
1)CCM模式
2)GCM模式,例如AES128-GCM,AES256-GCM;
3)ChaCha20-Poly1305
一个Cipher Suites(加密算法套件)是以下4个算法的组合:
3. Authentication(认证)算法:有RSA,ECDSA,DH等;
4. Encryption(加密)算法:AES-128, AES-256, AESGCM256等;
5. Message Authentication Code(消息认证, MAC)算法:有AEAD, SHA1, SHA256等;
6. Key Exchange(密钥交换)算法,有ECDH, DH, DH/DSS,DH/RSA等。
六、HTTPS协议详情
6.1 Handshake Protocol: Client Hello (Client -> Server)
1)Handleshake Protocol
2)TLS协议版本
3) 客户端生成的随机数client.random,长度48字节;
4) 支持的加密算法套件(Cipher Suites), 例如TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
5) 支持的压缩方法
6)扩展属性
6.2 Handshake Protocol: Server Hello (Server --> Client)
包含内容:
1)Handleshake Protocol
2)TLS协议版本
3) 服务器生成的随机数server.random
4) session ID(32字节)
5)服务端支持的Cipher Suit,这里是:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
6) 扩展部分
6.3 Certificate (Server --> Client)
证书的内容包括以下几部分:
7. 版本号(version): v3 (2)
8. 序列号(serialNumber): 长度16字节,例如:0x03aa20c7c44887f2b628b63d28a39e78
9. 签名算法(signature): sha256WithRSAEncryption,它包含一个Algorithm Id,例如1.2.840.113549.1.1.11,用来标识该签名算法
10. 版本者(issuer)
11. 有效期(validity),包含起始时间(notBefore)和结束时间(notAfter)
12. 使用者(subject)
13. 使用者公钥信息(subjectPublicKeyInfo)
包含以下内容:
① 算法类型(algorithm),例如:rsaEncryption,其Algorithm Id是: 1.2.840.113549.1.1.1 (rsaEncryption)
② 公钥信息(subjectPublicKey),包括公钥(modulus,长度256字节),指数(publicExponent,65537)
14. 算法标识(algorithmIdentifier),例如:sha256WithRSAEncryption
15. 证书签名(encrypted),长度256字节,例如:88291e3da5b2d39ed5406cb1185d27fd3abe233d3e4c2050…
6.4 Server Key Exchange (Server --> Client)
协议包含的内容有:
4. 1 Content Type: Handshake (22) (1bytes)
4. 2 Version: TLS 1.2 (0x0303) (2bytes)
4. 3 Length: 333 (2bytes)
4. 4 Handshake Protocol: Server Key Exchange (333bytes),包含:
① Handshake Type: Server Key Exchange (12) (3bytes)
② Length:329 (3bytes)
③ EC Diffie-Hellman Server Params(329bytes),共有:
Curve Type: named_curve (0x03) (1bytes)
Named Curve: secp256r1 (0x0017) (2bytes)
Pubkey Length: 65 (1bytes)
Pubkey: 04f3f88d904af655faeeded2ba6453d34b1ba95160aaf427… (65bytes)
Signature Algorithm: rsa_pkcs1_sha256 (0x0401) (2bytes)
Signature Length: 256 (2bytes)
Signature: 4809b694a751868299023f90385b2012ed9a2916c957da16…(256bytes)
6.5 Server Hello Done (Server --> Client)
表示服务端Server Hello的结束。
6.6 Client Key Exchange (Client --> Server)

6. 7 Server --> Client