type
status
date
slug
summary
tags
category
icon
password
Sub-item
Last edited time
Oct 28, 2023 10:41 AM
Parent item
领域
第1部分 密码 1
第1章 环游密码世界 3
1.5 密码学家的工具箱 12
1.7 密码与信息安全常识 14
1.7.1 不要使用保密的密码算法 14
1.7.2 使用低强度的密码比不进行任何加密更危险 15
1.7.3 任何密码总有一天都会被破解 15
1.7.4 密码只是信息安全的一部分 16
第3章 对称密码(共享密钥密码)——用相同的密钥进行加密和解密 45
一次一密是流密码,可以加密任意长度的明文。
DES、3DES、AES是分组密码, 只能加密固定大小block的明文。如果要加密任意长度的数据, 需要结合模式进行迭代加密。
3.4 一次性密码本——绝对不会被破译的密码 50
3.4.1 什么是一次性密码本 50
即使遍历整个秘钥空间,也无法破译一次性密码本, 因为可以破移除很多“明文”, 你无法知道哪一个是发送者发送的正确的明文。因此, 一次性密码本是无法破译的。
3.4.2 一次性密码本的加密 50
按照比特用秘钥对明文进行异或
3.4.3 一次性密码本的解密 51
按照比特用秘钥对密文进行异或
3.4.5 一次性密码本为什么没有被使用 52
- 秘钥的配送, 安全性和明文一样。
- 秘钥的保存。
- 秘钥的复用,绝对不能复用已经用过的秘钥,因为一旦泄露,以前的明文都将被破解。
- 秘钥的同步,加密和解密的秘钥比特序列不允许有任何的错位。
- 秘钥的生成,必须是真随机数。
3.5 DES 53
3.5.1 什么是DES 53 已被破解,废弃使用
数据加密标准。以8字节64比特为单位的分组密码block cipher。
3.5.2 加密和解密 54
3.6 三重DES 61 已不建议在新的场景中使用
3.6.1 什么是三重DES 61
将DES重复3次。
3.6.2 三重DES的加密 61
秘钥1,秘钥2,秘钥3使用不同的秘钥,叫做DES-EDE3.
如果秘钥1、秘钥3相同,那么叫做DES-EDE2.
如果都相同, 那就是普通的DES。
3.6.3 三重DES的解密 63
和加密的顺序相反执行即可。 即: 秘钥3解密-秘钥2加密-秘钥1解密。
3.7 AES 65 建议使用
3.7.1 什么是AES 65
高级加密标准,通过公开竞赛选拔出Rijndael作为AES的标准算法。
3.8.1 什么是Rijndael 66
分组长度固定为16字节128位。秘钥长度有128位,192位,256位3种。
3.8.2 Rijndael的加密和解密 67
- subBytes。根据每个字节根据值(0~255),从256字母替换表,替换为对应的字母。
- sshiftRows。左移行。
- mixColumnns。矩阵运算混合列。
- addRoundKey。与轮秘钥进行异或。
3.8.3 Rijndael的破译 71 目前还没有有效的攻击。
第4章 分组密码的模式——分组密码是如何迭代的 75
4.2 分组密码的模式 77
4.2.1 分组密码与流密码 77
block cipher:每次只能处理固定长度的数据。
stream cipher:以比特为单位进行加解密,1比特,8比特,32比特等等。
4.2.2 什么是模式 77
讲一段很长的明文使用分组密码进行迭代加密的方式, 叫做模式。
4.2.3 明文分组与密文分组 78
明文分组与密文分组的长度是一样的。比如AES固定为16字节。
4.3 ECB模式 79 电子密码本 不推荐使用
4.3.1 什么是ECB模式 79
4.3.2 ECB模式的特点 80
- 明文分组和密文分组一一对应。
- 相同的明文会被加密为相同的密文。
4.3.3 对ECB模式的攻击 80
最大的弱点是:在不破译明文的情况下操纵明文。
例如: 一个转账的数据包括 from,to,value,即使加密后, 也可以更换from和to的顺序, 变成 to,from,value。解密后的数据都是对的,但已经不是原始的意思。
4.4 CBC模式 82 密文分组链接 推荐使用 在HTTPS中使用的就是3DES-EDE3和AES_256_CBC。
4.4.1 什么是CBC模式 82
4.4.2 初始化向量 83
在加密第一个明文分组时, 没有前一个密文分组,所以需要事先准备一个相同长度的比特序列, 叫做初始向量。
4.4.3 CBC模式的特点 84
- 即使相同的明文分组, 加密后密文分组也不一样。
- 相同的明文,在不同的IV下, 明文也不一样。
- 即使破坏一个明文分组,也只能影响2个明文分组数据的正确性。
- 如果部分密文缺失, 那么后面的所有的解密都将错误。
4.4.4 对CBC模式的攻击 84
4.4.5 填充提示攻击 86
4.4.6 对初始化向量(IV)进行攻击 86
IV必须使用不可预测的随机数。在TLS1.0以上, 每次都需要显式传递IV。
4.4.7 CBC模式的应用实例 86
4.5 CFB模式 88 密文反馈模式 属于流密码
4.5.1 什么是CFB模式 88
4.5.2 初始化向量 89 同CBC模式
4.5.3 CFB模式与流密码 89
CFB非常类似一次一密的方式。先异或再加密,使用分组密码实现了流密码。
4.5.5 对CFB模式的攻击 90 重放攻击
发送者使用相同的秘钥,多次发送消息, 攻击者截获上一次的密文,替换本次的部分密文, 这样接收者就收到了错误的明文。
解决办法是: 使用消息认证码或签名, 每次会话更换秘钥。
4.6 OFB模式 91 输出反馈模式 属于流密码
4.6.1 什么是OFB模式 91
4.6.2 初始化向量 92 同之前的模式
4.6.3 CFB模式与OFB模式的对比 92
OFB可以提前准备好所有秘钥, 并发加密, 因此速度要更快。
4.7 CTR模式 93 属于流密码 推荐使用
4.7.1 计数器的生成方法 95
4.7.2 OFB模式与CTR模式的对比 95
4.7.3 CTR模式的特点 95
4.7.4 错误与机密性 96
4.8 应该使用哪种模式呢 96
第5章 公钥密码——用公钥加密,用私钥解密 101
5.3 密钥配送问题 102
5.3.1 什么是密钥配送问题 102
对方要解密数据,必须拿到对称秘钥才行,否则无法解密。但是配送中被窃听,那就攻击者也能正确解密。
5.3.2 通过事先共享密钥来解决 104 两两协商,数量很大
5.3.3 通过密钥分配中心来解决 105
潜在的问题:
1. 加密需求量大,秘钥中心压力大,
2. 单点故障也会导致全部加密通信瘫痪。
3. 攻击者攻击秘钥中心
5.3.4 通过Diffie-Hellman密钥交换来解决密钥配送问题 106
5.3.5 通过公钥密码来解决密钥配送问题 106
5.4 公钥密码 107
5.4.1 什么是公钥密码 107
- 加密和解密使用不同的秘钥
- 私钥加密,公钥解密
- 公钥加密,私钥解密
5.4.3 公钥通信的流程 108
- 先发送公钥给需要加密通信的对方
- 对方用公钥加密数据
- 自己用私钥解密数据
5.4.5 公钥密码无法解决的问题 110
- 公钥认证的问题。使用公钥的人要判断公钥是否合法正确。
- 公钥处理速度是对称秘钥的几百分之一。
5.5 时钟运算 / 模运算 110
5.5.1 加法 111 时针向右转求模。比如: 3 + 6 = 2,也就是 (3 + 6)mod 7 = 2
5.5.2 减法 113 转换为加法。 时针向左转,转换为时针向右转求模. 比如: 2 - 6 = 3,也就是(2 - 6)mod 7 = 3
5.5.3 乘法 114 重复做加法。
如果乘数大于模, 可以先取模再相乘, 再取模.
5.5.4 除法 114 乘法的逆运算。 将除法转换为乘法. 例如3/7 mod12, 其实可以转化为3× (1/7) mod12.
1/7称为逆元, 写作. 想要求逆元, 就是要计算 7*<多少> mod12= 1
也就是说在mod12的世界中,7乘以多少等于1. 就是需要向右转多少次会指向1.
发现7*7mod12=1.
也可以叫做7和7互为倒数关系。完整的说法是:7的模12逆元是7。
在mod12的空间内,不是所有的数都有倒数。
有倒数的数的特点是和12之间的公约数只有1。也叫和12互质。
如果模为素素P, 那么所有在modP空间内的数都有倒数, 因此, 模运算的模都为质数. 在模素数的情况下我们才可以给任意两个元素计算“除法”。
5.5.5 乘方 118 重复的乘法。
可以拆开,先计算部分乘法的mod, 再相乘, 可以大大减少计算量。
5.5.6 对数 118 乘方的逆运算。也叫离散对数。
5.6 RSA 120
5.6.1 什么是RSA 120 三个作者的首字母。
5.6.2 RSA加密解密 120
明文和密文的大小必须在秘钥空间N内。
5.6.4 生成密钥对 122
5.7 对RSA的攻击 128
5.7.1 通过密文来求得明文 128 取决于计算离散对数的难度
5.7.2 通过暴力破解来找出D 128 D足够长
5.7.3 通过E和N求出D 129 取决于因式分解的难度。 p,q必须要保管好,不能被破译者知道
5.7.4 中间人攻击 130 通过证书来解决。
5.7.5 选择密文攻击 132
假设服务器对于收到的数据都当做密文进行解密, 并返回解密的结果,叫做解密提示, 攻击者可以生成不同的数据, 来根据提示获得信息。因此,需要在解密的时候知道密文是通过合法的方式生成的。RSA-OEAP最优非对称加密填充, 可以对密文进行认证。在明文前面填充一些认证消息。
5.8 其他公钥密码 133
5.8.1 ElGamal方式 133
5.8.2 Rabin方式 133
5.8.3 椭圆曲线密码 133
5.9 关于公钥密码的Q&A 133
5.9.1 公钥密码的机密性 134 和秘钥长度有关。
5.9.2 公钥密码与对称密码的密钥长度 134
5.9.3 对称密码的未来 135
5.9.4 RSA与质数 135
5.9.5 RSA与质因数分解 136
5.9.6 RSA的长度 136
第6章 混合密码系统——用对称密码提高速度,用公钥密码保护会话密钥 141
第2部分 认证 151
第7章 单向散列函数——获取消息的“指纹” 153
7.3 单向散列函数的实际应用 163
7.3.1 检测软件是否被篡改 163
7.3.2 基于口令的加密 165 口令+salt后再hash,防止字典攻击。
7.3.3 消息认证码 165 将发送者和接收者之间共享秘钥和消息混合后计算hash
7.3.4 数字签名 165 先计算hash再签名
7.3.5 伪随机数生成器 165
7.3.6 一次性口令 165 服务端对客户端的合法性认证
7.4 单向散列函数的具体例子 166
7.4.1 MD4、MD5 166 message digest
7.4.2 SHA-1、SHA-256、SHA-384、SHA-512 166
7.4.3 RIPEMD-160 167 比特币中在使用
7.4.4 SHA-3 167 第三代sha, 以太坊等区块链技术使用
7.6 Keccak 169 第三代sha的胜出者
7.6.1 什么是Keccak 169
7.6.2 海绵结构 170
7.6.3 双工结构 171
7.6.4 Keccak的内部状态 172
7.6.5 函数Keccak-f [b ] 174
7.6.6 对Keccak的攻击 177
7.7 应该使用哪种单向散列函数呢 178 sha2和sha3
7.8 对单向散列函数的攻击 178
7.8.1 暴力破解(攻击故事1) 178
利用文档的冗余性,生成一大堆修改数据后的hash值,如果原文计算的hash值相同,那么就意味着成功破解。
找出具有指定hash值的消息的攻击分为2种:
- 原像攻击(pre-image attack)。给定一个hash值,找出任何一个具有该hash值的消息
- 第二原像攻击(second pre-image attack)。给定消息1, 找出消息2、消息3的hash值和消息1相同。
7.8.2 生日攻击(攻击故事2) 180
找到只要消息值相同的2条消息, 成功概率是暴力破解的2倍。
7.9 单向散列函数无法解决的问题 182
无法识别消息发送者的身份,即无法辨别出是否“伪装”。
第8章 消息认证码——消息被正确传送了吗 187
8.2 消息认证码 188
8.2.1 汇款请求是正确的吗 188
认证消息是否来自正确的发送者。
8.2.2 什么是消息认证码 189
一种和秘钥相关联的hash函数:输入一个任意长度的消息,和发送者和接收者之间的共享秘钥,输出固定长度的数据,成为MAC。
8.2.3 消息认证码的使用步骤 190
8.2.4 消息认证码的密钥配送问题 190
8.3 消息认证码的应用实例 191
8.3.1 SWIFT 191
8.3.2 IPsec 191
8.3.3 SSL/TLS 192
8.4 消息认证码的实现方法 192
8.4.1 使用单向散列函数实现 192 HMAC
8.4.2 使用分组密码实现 192 AES-CMAC
用AES对消息进行加密,把最后一个分组的密文作为MAC。
8.4.3 其他实现方法 192
- 流密码
- 公钥
只要保证消息认证码关联整个消息和秘钥就行
8.5 认证加密 192
对称秘钥+消息认证吗 = 认证机密。 解决窃听、篡改、伪装3大问题。
- Encrypt-then-MAC:这段密文是由知道明文和秘钥的人生成的。
- 先用对称秘钥将明文加密
- 计算密文的MAC值
- Encrypt-and-MAC:
- 先用对称秘钥将明文加密
- 计算明文的MAC值
- MAC-and-Encrypt:
- 计算明文的MAC值
- 先用对称秘钥将明文+MAC值同时进行加密
- GCM(Galois/Counter Mode) / CCM(CBC Counter Mode) GCM也叫GMAC
利用AES-128-CTR模式,然后反复进行加法乘法运算(伽罗瓦域,有限域)
8.6 HMAC的详细介绍 193
8.6.1 什么是HMAC 193 使用hash函数构造消息认证码
8.6.2 HMAC的步骤 194
- 如果秘钥长度<hash的分组长度,在末尾填充0,作为HMAC的秘钥。如果秘钥长度>hash的分组长度,计算秘钥的hash值,作为HMAC的秘钥。
- 将HMAC的秘钥和ipad的比特序列进行异或。ipad是16进制的36值的循环。00110110 00110110 00110110..., 异或后得到ipadkey。i是内部的意思
- 和消息进行组合
- 使用hash函数计算hash值。 这里的hash函数可以是: sha256,sha3, sha1等
- 将HMAC的秘钥和opad的比特序列进行异或。opad是16进制的5C值的循环。01011100 01011100 01011100..., 异或后得到opadkey。o是内部的意思
- 将4的结果拼接在opadkey后面
- 再次计算hash值。得到最终的HMAC值。
8.7 对消息认证码的攻击 196
8.7.1 重放攻击 196
- 攻击者窃听A、B银行之间的通信
- 攻击者在A银行向自己在B银行的账户发起转账请求
- 正常情况下,A银行收到请求, 然后计算MAC值,最后把请求和消息同时发给B银行
- B银行验证MAC后,执行转账动作
- 攻击者监听转账请求的消息及MAC值,并保存下来, 再次发给B银行
- B银行以为是A银行发过来的,于是再次执行了转账。
防御攻击的方法:
- 序号。每个消息都加一个递增的序号,并在计算MAC值时将序号计算在内。缺点是每个通行对象都要记录该序号。
- 时间戳。每个消息包含当前时间。缺点是时间必须同步,但考虑到延时,还是有重放的空间
- nonce。通信前接收者先发送一次性nonce给发送者,发送者将nonce计算在MAC值内,缺点是通信量会增加。
8.7.2 密钥推测攻击 198
8.8 消息认证码无法解决的问题 199
8.8.1 对第三方证明 199 数字签名可以解决该问题
8.8.2 防止否认 199 数字签名可以解决该问题
第9章 数字签名——消息到底是谁写的 203
9.3 数字签名 204
9.3.1 Alice的借条 204
Alice写了一个借条,并使用消息认证码进行认证, Bob收到后验证ok, 但是过一段你时间后,Alice却否认了写过借条。因为Bob也无法确认Alice的秘钥有没有泄露出去,被别人利用来写这个欠条。本质上是因为他俩之间必须共享一个只有他们知道的秘钥,这个秘钥不能保证没有被泄露。Alice也可以说这个消息认证码是Bob生成的,Alice不承认。
9.3.4 公钥密码与数字签名 207
签名: 私钥加密,私钥持有者才能签名
验证: 公钥解密, 任何人都可以验证
9.4 数字签名的方法 209
9.4.1 直接对消息签名的方法 209
9.4.2 对消息的散列值签名的方法 211
9.5 对数字签名的疑问 214
9.5.1 密文为什么能作为签名使用 214 因为只有持有者才能生成该密文
9.5.2 数字签名不能保证机密性吗 214 不能
9.5.3 这种签名可以随意复制吗 215 即使被复制,也只能证明是签名者发出的签名消息, 不能否认该事实
9.5.4 消息内容会不会被任意修改 215 可以任意修改, 但是签名能够识别出修改
9.5.5 签名会不会被重复使用 216 验证签名会失败
9.5.6 删除签名也无法“作废合同”吗 216 无法作废。需要重签一份作废的签名
9.5.7 如何防止否认 217 只有持有私钥的人,才能生成签名
9.5.8 数字签名真的能够代替签名吗 217
9.6 数字签名的应用实例 218
9.6.1 安全信息公告 218
9.6.2 软件下载 219
9.6.3 公钥证书 220
9.6.4 SSL/TLS 220
9.7 通过RSA实现数字签名 220
9.7.1 用RSA生成签名 220
9.7.2 用RSA验证签名 221
9.8 其他的数字签名 222
9.8.1 ElGamal方式 222
9.8.2 DSA 223
9.8.3 ECDSA 223
9.8.4 Rabin方式 223
9.9 对数字签名的攻击 223
9.9.1 中间人攻击 223 通过证书解决
9.9.2 对单向散列函数的攻击 224 取决于hash函数的安全性
9.9.3 利用数字签名攻击公钥密码 224 RSA有这个问题,因为加解密是完全对称的
9.9.4 潜在伪造 225
例如用RSA的公钥对随机数据S进行加密得到M,那么S就是M的签名(用私钥对M加密就是S)。这就是潜在伪造。RSA-PSS算法对消息加盐后再计算hash值,然后再使用RSA签名。RSA-PSS属于PKCS规范之一。
9.9.5 其他攻击 226
9.10 各种密码技术的对比 226
9.10.1 消息认证码与数字签名 226
9.10.2 混合密码系统与对散列值签名 227
对称密码的秘钥是机密性的精华,hash函数的hash值是完整性的精华
9.11 数字签名无法解决的问题 227
用于签名的公钥必须属于真正的发送者
第10章 证书——为公钥加上数字签名 229
10.2 证书 230
10.2.1 什么是证书 230
10.2.2 证书的应用场景 230
10.3 实际生成一张证书 233
10.3.4 证书标准规范 236 X.509
证书编码格式:
同样的 X.509 证书,可能有不同的编码格式,目前有以下两种编码格式:
- DER - Distinguished Encoding Rules。是二进制格式。打开看是二进制格式,不可读。
查看 DER 格式证书的信息:openssl x509 -in certificate.der -inform der -text -noout 。
Java 和 Windows 服务器偏向于使用这种编码格式。
- PEM - Privacy Enhanced Mail。是文本格式。是指由肉眼可以识别的字符组成的。例如
- 开头是
—–BEGIN CERTIFICATE—–
表示证书, - 开头是
—–BEGIN RSA PRIVATE KEY—–
表示私钥。
文本格式实际上上对二进制的数据进行base64编码。文本格式怎么变成二进制? 去掉前后的 - - - - 行,剩下的去掉回车,用base64解码,就得到二进制了。
查看 PEM 格式证书的信息:openssl x509 -in certificate.pem -text -noout 。
Apache 和 UNIX 服务器偏向于使用这种编码格式。
CA证书证书文件扩展名:
虽然我们已经知道有 PEM 和 DER 这两种编码格式,但文件扩展名并不一定就叫“PEM”或者“DER”,常见的扩展名除了 PEM 和 DER 还有以下这些,它们除了编码格式可能不同之外,内容也有差别,但大多数都能相互转换编码格式。
.CRT
文件:是 certificate 的三个字母,其实还是证书的意思。这样的证书文件大多数是 PEM 编码,少数是DER编码。常见于 UNIX 系统。
- .DER或
.CER
文件: 还是 certificate,还是证书。这样的证书文件是二进制格式,只含有证书信息,不包含私钥。大多数应该是 DER 编码,少数 PEM 编码。常见于 Windows 系统。
.KEY
文件:通常用来存放一个私钥,并非 X.509 证书。编码可能是 PEM,也可能是 DER。
.CSR
文件:Certificate Signing Request,即证书签名请求。这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息)。在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好。
.PFX/.P12
文件:predecessor of PKCS#12,对 unix 服务器来说,一般 CRT 和 KEY 是分开存放在不同文件中的,但 Windows 的 IIS 则将它们存在一个 PFX 文件中,(因此这个文件包含了证书及私钥)这样会不会不安全?应该不会,PFX 通常会有一个“提取密码”,你想把里面的东西读取出来的话,它就要求你提供提取密码,PFX 使用的是 DER 编码。
.PEM
文件:这样的证书文件一般是文本格式,可以存放证书或私钥,或者两者都包含。 .PEM 文件如果只包含私钥,一般用.KEY文件代替。
10.4 公钥基础设施(PKI) 237
10.4.1 什么是公钥基础设施 237
为了有效运用公钥而制定的一些列规范
10.4.2 PKI 的组成要素 238
10.4.3 认证机构的工作 240
- 生成秘钥对
- 注册证书。认证机构使用私钥对x.509的证书进行签名
- 作废证书和CRL(证书作废清单)。用户需要获取最新的CRL才能知道哪些证书被作废了。
10.4.4 证书的层级结构 241
最顶层的是根CA,用私钥自签名证书,自己认证自己。他可以签发下一级的CA的公钥证书。
证书的校验:
TLS 协议中重要的一环是如何校验证书的真实性。虽然有些 TLS 握手不需要证书(例如,使用 Diffie-Hellman(DH) 算法的 TLS 握手),但是这些情况都被证实不安全,而且很少使用。
要证明证书的真实性,通常依赖于一组受信任的第三方证书颁发机构(Certificate authorities, CA)。验证 TLS 证书有效性的方法如下:
- 检查证书是否是浏览器中受信任的根证书机构颁发
证书都是上级 CA 签发的,上级的 CA 可能还有上级,直到找到根证书。
- 检查证书中的证书吊销列表(CRL),看证书是否已经被吊销
证书被吊销后,会被记录在证书吊销列表中,CA 会定期发布 CRL。应用程序可以根据 CRL 来检查证书是否被吊销。
- 通过在线证书状态协议(OCSP)检查证书是否有效
CA 会提供实时的查询接口,用来查询证书的有效性。在线实时查询会使得 TLS 握手时间延长,因为浏览器需要等待查询结束才能继续 TLS 握手。至于使用在线查询还是证书中的吊销列表,由浏览器决定。
- 检查证书是否过期
- 检查域名和证书中的域名是否一致
- 查询网站是否被列入了欺诈网站黑名单。这一步 IE7 会进行,IE7 会到欺诈网站数据库,查询网站是否被列入了欺诈黑名单。
经过了以上步骤,浏览器中才会显示安全锁的标志。任意一个步骤出问题,浏览器都无法建立安全链接,并最终提示“您的链接不是私密链接”。
10.5 对证书的攻击 243
10.5.1 在公钥注册之前进行攻击 244
10.5.2 注册相似人名进行攻击 245
10.5.3 窃取认证机构的私钥进行攻击 245
10.5.4 攻击者伪装成认证机构进行攻击 246
10.5.5 钻CRL的空子进行攻击(1) 246
10.5.6 钻CRL的空子进行攻击(2) 247
10.5.7 Superfish 248
>10.6 关于证书的Q&A 249
10.6.1 为什么需要证书 249 确保我使用的公钥就是我的通信对象持有的公钥, 而不是中间人伪造的公钥。
10.6.2 通过自己的方法进行认证是不是更安全 250 不安全
10.6.3 为什么要相信认证机构 251
第3部分 密钥、随机数与应用技术 255
第11章 密钥——秘密的精华 257
11.2 什么是密钥 258
11.2.1 密钥就是一个巨大的数字 258
11.2.2 密钥与明文是等价的 260
11.3 各种不同的密钥 260
11.3.1 对称密码的密钥与公钥密码的密钥 260 对称秘钥和私钥必须保密
11.3.2 消息认证码的密钥与数字签名的密钥 261
11.3.3 用于确保机密性的密钥与用于认证的密钥 262
11.3.4 会话密钥与主密钥 263 会话密钥是指每个会话都更新, 主秘钥会一直被重复使用,用于生成会话秘钥
11.3.5 用于加密内容的密钥与用于加密密钥的密钥 264
11.4 密钥的管理 264
11.4.1 生成密钥 264
- 随机数
- 口令+盐 =》hash计算 PBE(password based encryptoin)
11.4.2 配送密钥 265 见上文
11.4.3 更新密钥 265 定期更新秘钥
11.4.4 保存密钥 266 KEK:秘钥加密后保存,只要记住解密密码就行,
11.4.5 作废密钥 267
11.5 Diffie-Hellman密钥交换 268
存在可能的中间人攻击, 需要结合签名和证书来应对。
11.5.1 什么是Diffie-Hellman密钥交换 268 根据算法在不共享秘钥的情况下,通过共享部分参数就能生成安全可用的共享秘钥
11.5.2 Diffie-Hellman密钥交换的步骤 268
11.5.3 Eve能计算出密钥吗 270 不能
11.5.4 生成元的意义 271
设一个质数P, modP的时钟运算,某个数(范围是1~P-2)的乘方取mo后和1~P-1是一一对应的, 这个数叫做P的生成元。比如:
当选定G和P之后,乘方的运算可以将A值在有限域内,进行变换。
11.5.6 Diffie-Hellman密钥交换 273 能够用较短的秘钥长度实现较高的安全性
11.6 基于口令的密码(PBE) 274 根据口令生成秘钥并用该秘钥进行加密
11.6.1 什么是基于口令的密码 274 类似于keystore,不用记住和保管秘钥原文
11.6.2 PBE加密 275
11.6.3 PBE解密 276
11.6.4 盐的作用 277 防御字典攻击
攻击者可以事先生成大量的KEK,来撞库。
11.6.5 口令的作用 279
11.6.6 通过拉伸来改良PBE 279
计算多次Hash。
11.7 如何生成安全的口令 279
11.7.1 使用只有自己才能知道的信息 280
11.7.2 将多个不同的口令分开使用 280
11.7.3 有效利用笔记 281
11.7.4 理解口令的局限性 281
11.7.5 使用口令生成和管理工具 282
第12章 随机数——不可预测性的源泉 285
12.3 使用随机数的密码技术 286
12.4 随机数的性质 287
12.4.1 对随机数的性质进行分类 287
12.4.2 随机性 288
12.4.3 不可预测性 289
12.4.4 不可重现性 289
12.5 伪随机数生成器 291
12.6 具体的伪随机数生成器 292
12.6.1 杂乱的方法 293
12.6.2 线性同余法 293
12.6.3 单向散列函数法 296
12.6.4 密码法 298
12.6.5 ANSI X9.17 300
12.6.6 其他算法 302
12.7 对伪随机数生成器的攻击 303
12.7.1 对种子进行攻击 303
12.7.2 对随机数池进行攻击 303
第13章 PGP——密码技术的完美组合 307
13.2 PGP 简介 308
13.2.1 什么是PGP 308
13.2.2 关于OpenPGP 309
13.2.3 关于GNU Privacy Guard 309
13.2.4 PGP的功能 310
13.3 生成密钥对 311
需要自动秘钥类型、长度、有效期、口令、姓名邮箱,及其他证书相关的配置。最后生成一个文件。使用时通过口令从该文件中解密得到秘钥对。
13.4 加密与解密 314
13.4.1 加密 314
13.4.2 解密 316
13.5 生成和验证数字签名 319
13.5.1 生成数字签名 319
13.5.2 验证数字签名 321
13.6 生成数字签名并加密以及解密并验证数字签名 324
13.6.1 生成数字签名并加密 324
13.6.2 解密并验证数字签名 324
13.7 信任网 328
13.7.1 公钥合法性 328
不依赖于认证机构,而是每个用户对对方的公钥进行数字签名。
13.7.2 场景1:通过自己的数字签名进行确认 328
13.7.3 场景2:通过自己完全信任的人的数字签名进行确认 329
13.7.4 场景3:通过自己有限信任的多个人的数字签名进行确认 330
13.7.5 公钥合法性与所有者信任是不同的 331
13.7.6 所有者信任级别是因人而异的 331
第14章 SSL/TLS ——为了更安全的通信 335
14.2 什么是SSL/TLS 336
14.2.3 用SSL/TLS承载HTTP 338
用SSL或TLS作为通信加密协议,在此基础上承载HTTP协议。
14.2.4 SSL/TLS的工作 339
解决窃听、篡改、伪装的问题。对应数据的机密性、数据的完整性认证、通信对象认证。
14.2.5 SSL/TLS也可以保护其他的协议 340
14.2.7 SSL与TLS的区别 341
先有SSL, 发展到SSL3.0之后已发现不再安全,TLS在SSL3.0基础上发布, 现在是TLS1.X版本。
14.3 使用SSL/TLS进行通信 341
14.3.1 层次化的协议 341
14.3.2 1 TLS记录协议 343
负责数据分片,数据压缩,计算消息认证码(带上片段序号,防止重放),用共享对称秘钥(CBC模式,IV由主密码生成)对消息进行加密通信。
14.3.3 2-1握手协议 344
协商使用哪些密码算法和版本,协商共享秘钥。交换证书,客户端对网站证书进行认证。
14.3.4 2-2密码规格变更协议 350
向对方传达变更密码方式。
14.3.5 2-3警告协议 351
负责在发生错误时,将错误传达给对方。
14.3.6 2-4应用数据协议 351
将TLS承载的数据传递给通信对象。
14.3.7 主密码 351
主密码是客户端和服务端之间协商出来的一个秘密数值。长度48字节。
在客户端发送ClientKeyExchange消息时,发给服务端。
14.3.8 TLS中使用的密码技术小结 353
14.4 对SSL/TLS的攻击 353
14.4.1 对各个密码技术的攻击 353
14.4.2 OpenSSL的心脏出血漏洞 353
14.4.3 SSL 3.0的漏洞与POODLE攻击 354
14.4.4 FREAK攻击与密码产品出口管制 354
14.4.5 对伪随机数生成器的攻击 355
14.4.6 利用证书的时间差进行攻击 355
14.5 SSL/TLS用户的注意事项 356
14.5.1 不要误解证书的含义 356
14.5.2 密码通信之前的数据是不受保护的 356
14.5.3 密码通信之后的数据是不受保护的 356