From 6cc68e45d4040612b68de9866a68e85ee9e3d45c Mon Sep 17 00:00:00 2001 From: fwqaaq Date: Tue, 16 Jan 2024 17:02:30 +0800 Subject: [PATCH] Cryptography --- JavascriptAPI/Cryptography.md | 73 ++++++++++++++++++++++++++++------- 1 file changed, 58 insertions(+), 15 deletions(-) diff --git a/JavascriptAPI/Cryptography.md b/JavascriptAPI/Cryptography.md index 9cc2b0a..38e5e95 100644 --- a/JavascriptAPI/Cryptography.md +++ b/JavascriptAPI/Cryptography.md @@ -2,19 +2,6 @@ ## 加密算法 -### 分组密码操作模式 - -> 分组密码是一种加密算法,它将明文划分为固定大小的块(或分组),然后对每个块进行加密。 - -* CB(Electronic Codebook):每个块独立加密。这是最简单的模式,但也是最不安全的,因为相同的明文块会被加密为相同的密文块。 -* CBC(Cipher Block Chaining):每个明文块与前一个密文块进行异或操作后再加密。第一个块与一个随机初始化向量(IV)异或。 -* CTR(Counter Mode):将分组密码转变为流密码。使用一个计数器,与每个明文块异或,然后加密计数器。 -* GCM(Galois/Counter Mode):结合了 CTR 模式的流密码特性和额外的认证功能。 -* OFB(Output Feedback):与 CTR 类似,但是异或的是连续加密的 IV。 -* CFB(Cipher Feedback):与 OFB 类似,但是密文被馈送回输入。 - -例如:AES-CBC 是指使用 AES 算法和 CBC 操作模式的加密方法。这种组合为数据提供了机密性,并且由于 CBC 模式的引入,相同的数据块不会被加密成相同的密文块,从而增加了安全性。 - ### 非对称加密 非对称加密(Asymmetric Encryption)指使用不同的密钥进行数据加密和解密的加密机制。其主要特点包括: @@ -114,12 +101,30 @@ ECDH(Elliptic Curve Diffie-Hellman)是一种基于椭圆曲线的密钥交 2. 加解密使用反向算法。加密算法和解密算法通常都是反向互逆的。 3. 加解密速度快。相比非对称加密,运算效率高,加解密速度快。 4. 保密性好但扩展性差。密钥分发和管理困难,不适合大规模系统。 -5. 算法例如 AES、DES、RC4 等。 +5. 算法例如 AES(Advanced Encryption Standard)、DES(Data Encryption Standard)、RC4 等。 + +> [!NOTE] +> AES 现在已经是实际的标准,而 DES 已经过时(能够暴力破解),我们应该避免使用 DES。 对称加密应用场景:保护数据机密性,如文件加密;对速度敏感的大数据加密;在对等连接的安全通信;模式如:电子密码本、块密码等。 相比非对称加密,对称加密速度快、效率高,但密钥管理和分发复杂。需要同时具备保密性和认证性。通常用于加密会话和大数据量的场景。 +* 密码算法分为分组密码和流密码两种 + * 分组密码是一种只能处理特定长度的一块数据的加密算法,它将明文划分为固定大小的块(或分组),然后对每个块进行加密。 + * 流密码是对数据进行连续处理的一类密码算法。流密码一般以 2bit、8bit、32bit 等单位进行加密和解密。 + +#### 分组密码操作模式 + +* ECB(Electronic Codebook):每个块独立加密。这是最简单的模式,但也是最不安全的,因为相同的明文块会被加密为相同的密文块。 +* CBC(Cipher Block Chaining):每个明文块与前一个密文块进行异或操作后再加密。第一个块与一个随机初始化向量(IV)异或。 +* CTR(Counter Mode):将分组密码转变为流密码。使用一个计数器,与每个明文块异或,然后加密计数器。 +* GCM(Galois/Counter Mode):结合了 CTR 模式的流密码特性和额外的认证功能。 +* OFB(Output Feedback):与 CTR 类似,但是异或的是连续加密的 IV。 +* CFB(Cipher Feedback):与 OFB 类似,但是密文被馈送回输入。 + +例如:AES-CBC 是指使用 AES 算法和 CBC 操作模式的加密方法。这种组合为数据提供了机密性,并且由于 CBC 模式的引入,相同的数据块不会被加密成相同的密文块,从而增加了安全性。 + #### HMAC > HMAC(Hash-based Message Authentication Code)是一种基于哈希函数和密钥的消息认证码算法。它可以用于验证消息的完整性和身份验证消息的发送方。 @@ -228,7 +233,7 @@ AES-KW 的特点是: ### 摘要 -摘要是由散列函数从完整消息生成的更小值。理想情况下,摘要是可快速计算、不可逆且不可预测的,因此可用于表明是否有人篡改了给定的消息。 +摘要(也称为单向散列函数)是由散列函数从完整消息生成的更小值。理想情况下,摘要是可快速计算、不可逆且不可预测的,因此可用于表明是否有人篡改了给定的消息。**但是无法辨别伪装**。例如 bob 伪装成 alan 向 marry 发送了消息和摘要。 常见的信息摘要算法和摘要函数包括: @@ -244,6 +249,44 @@ AES-KW 的特点是: 当前使用较多的摘要函数是 SHA-2 系列,如 SHA-256。新兴的 SHA-3 和 BLAKE3 也较为推荐。选择安全可靠的摘要函数很重要。 +#### 消息认证码 + +通过消息认证码(Message Authentication Code,简称 MAC)可以确认自己收到的是否就是发送者的本意,使用消息认证码可以判断消息是否篡改,以及是否有人伪装成发送者发送了该消息。 + +消息认证码由任意长度的消息和一个发送者和任意接受者共享的密钥计算出来。 + +例如: + +1. a 和 b 之间要事先共享密钥。 +2. a 发送消息,以及根据共享密钥计算出 MAC 值发送。 +3. b 根据消息以及共享密钥计算 MAC 值,然后进行对比,相同则是同一个人。 + +例如 SSL/TLS 的内容的认证以及完整性校验就是使用消息认证码。 + +> [!WARNING] +> 无法解决**第三方证明**以及**防止否认**的问题。第三方证明:a 和 b 发送消息,a 想让 c 来证明发送消息的就是 b,即使 c 拿到了 MAC 值也不能确定发送消息的是 b,也有可能是 a 自己。防止否认:就像之前所说 a 确认这条消息来自 b,但是 a 可以向 c 否定这条消息来自自己。 + +#### 数字签名 + +使用数字签名来识别篡改和伪装以及防止否认。数字签名就是通过将**公钥**反过来用来实现的。在数字签名中,生成消息签名的行为和验证消息签名的行为是需要使用各自专用的密钥完成的。 + +使用非对称加密实现数字签名,使用私钥加密生成数字签名,公钥解密验证数字签名。 + +* 数字签名有直接对消息签名以及对消息的散列值签名的方式。 + * 直接对消息签名需要对整个消息加密,非常的耗时 + * 先对消息求摘要,再通过对摘要进行签名,然后发送给接受者,接受者通过对方的公钥进行认证。 + +>[!NOTE] +>数字签名并不保证消息的机密性。 + +#### 证书 + +证书是由认证机构颁发的,由 ITU 和 ISO 制定的 x.509_ 规范:证书序列号、证书颁发者、公钥所有者、SHA-1 指纹、证书 ID、有效期(起始以及结束时间)、散列算法、密钥类型、公钥、密钥用途。 + +认证者首先要生成公钥私钥(也可以由认证机构代为生成)。这时候认证者首先会将公钥给认证机构进行数字签名(即生成证书)再发送给接受者。 + +公钥基础设施(Public-Key Infrastructure,PKI)是为了更有效的运用公钥而制定的一套规范,RSA 制定的 PKCS 系列规范就是 PKI 的一种 + ## JavaScript API > 整个 windows 暴露出 `crypto` 对象,它有两个实例方法,以及暴露了一个 subtle 实例属性。