目录
11.1 本章学习的内容
- 什么是密钥
- 各种不同的密钥
- 密钥的管理
- Diffie-Hellman密钥交换
- 基于口令的密码(PBE)
- 如何生成安全的口令
11.2 什么是密钥
11.2.1 密钥就是一个巨大的数字
加密算法 | 密钥长度 |
DES | 56比特(7字节) |
3DES | DES-EDE2: 112比特(14字节) |
DES-EDE3: 168比特(21字节) | |
AES | 128比特 |
192比特 | |
256比特 |
11.2.2 密钥与明文是等价的
得到明文和得到密钥是等价的。
11.2.3 密码算法与密钥
信息的机密性不应该依赖于密码算法本省,而是依赖于妥善保管的密钥。
11.3 各种不同的密钥
11.3.1 对称密码的密钥与公钥密码的密钥
对称密码的密钥:共享密钥。
公钥密码的密钥:私钥、公钥、密钥对。
11.3.2 消息认证码的密钥与数字签名的密钥
消息认证码:共享的密钥来进行认证。
数字签名:私钥签名,公钥验证。
11.3.3 用于确保机密性的密钥与用于认证的密钥
确保机密性的密钥:对称密码和公钥密码的密钥。
认证的密钥:消息认证码和数字签名的密钥。
11.3.4 会话密钥与主密钥
会话密钥:每次通信只能使用一次的密钥
主密钥:一直被重复使用的密钥。
11.3.5 用于加密内容的密钥与用于加密密钥的密钥
加密内容的密钥:CEK。
加密密钥的密钥:KEK。
11.4 密钥的管理
11.4.1 生成密钥
1.用随机数生成密钥
最好的方法是使用随机数。最好使用硬件设备(能够生成密码学上的随机数),但是一般我们都使用伪随机数生成器(专门为密码学用途设计的软件)。
注意:伪随机算法的使用,必须是专门为密码学用途设计的算法,而不是软件开发中其他用途的伪随机数。
2.用口令生成密钥
一般是将口令输入单向散列函数,然后将得到的散列值作为密钥使用。为了防止字典攻击,需要在口令上附加一串盐(salt)。 注意这里讲解的是用口令生成的密钥,用于加解密的保证机密性的。注意与口令存储完整性的区别。详细讲解到11.6章节中。
11.4.2 配送密钥
事先共享密钥、使用密钥分配中心、使用公钥密码、Diffie-Hellman密钥交换。
11.4.3 更新密钥
密钥更新:使用共享密钥进行通信的过程中,定期改变密钥。
简单的说:用当前密钥的散列值作为下一个密钥。
后向安全:防止破译过去的通信内容的机制。
11.4.4 保存密钥
我们记不住密钥,但是如果将密钥保存下来有可能会被窃取。
方法:将密钥加密后保存。 加密密钥的密钥,称为 KEK。 但是KEK又该如何保存呢,这样看似陷入了一个死循环。但是现实是一个非常有效的方法,因为可以减少需要保管的密钥数量。
11.4.5 作废密钥
密钥的作废和生成同样重要。
11.5 Diffie-Hellman密钥交换
11.5.1 什么是Diffie-Hellman密钥交换
实际上没有真正交换密钥,而是通过计算生成了一个相同的共享密钥。也叫做Diffie-Hellman密钥协商。 利用的是离散对数问题。
11.5.2 Diffie-Hellman密钥交换的步骤
密钥交换步骤:
- Alice向Bob发送两个质数P和G(不需保密)
- Alice生成一个随机数A(保密)
- Bob生成一个随机数B(保密)
- Alice将 'G的A次方mod P' 这个数发送给Bob
- Bob将 'G的B次方mod P' 这个数发送给Alice
- Alice用Bob发过来的数计算A次方并求 mod P(见下方的图)
- Bob用Alice发过来的数计算B次方并求 mod P (见下方的图)
11.5.3 Eve能计算出密钥吗
离散对数,反向计算出A的有效算法,目前未出现。
11.5.4 生成元的意义
11.6 基于口令的密码(PBE)
11.6.1 什么是基于口令的密码
基于口令的密码(Password Based Encryption,PBE)是一种基于口令生成密钥,并使用该密钥进行加密的方法。其中加密和解密使用的是同一个密钥。
11.6.2 PBE加密
加密的过程:
- 生成KEK密钥:使用伪随机数生成器来生成salt,将salt和用户自己的口令使用单向散列函数算法生成KEK密钥。
- 生成会话密钥并加密:使用伪随机数生成器生成会话密钥CEK,使用步骤1生成的KEK密钥对会话密钥CEK进行加密,得到加密后的会话密钥,将步骤1生成的salt和步骤2生成的加密后的会话密钥保存起来,以供后面解密的时候使用。
- 加密消息:使用步骤2中生成的会话密钥CEK来对消息进行加密,从而得到加密后的消息。步骤1生成的KEK并不需要保存,因为它完全可以根据salt来重构。
11.6.3 PBE解密
解密过程:
- 重建KEK:使用保存的salt和用户记住的口令,根据单向散列算法重建KEK。
- 解密会话密钥:将保持的加密后的会话密钥使用步骤1生成的KEK解密,得到解密后的会话密钥
- 解密消息:使用解密后的会话密钥对加密过后的消息进行解密,得到最终消息原文。
11.6.4 盐的作用
salt是用来防御字典攻击的,因为用户自己的口令不具备随机性,很容易被暴力破解。加了salt之后,被暴力破解的难度大大加大。
11.6.5 口令的作用
11.6.6 PBE的改良
拉伸:将单向散列函数进行多次迭代的方法。
对于用户来说,多次迭代单向散列函数所需的时间可以忽略不计,但是对于攻击者来说,这是一个很大的负担。
11.7 如何生成安全的口令
- 使用只有自己才能知道的信息
- 将多个不同的口令分开使用
- 有效利用笔记
- 理解口令的局限性
- 使用口令生成和管理工具