当我们访问以https://开头的网页时,Web服务器和浏览器之间会进行基于SSL/TLS的加密通信。在这样的通信中所使用的密钥是仅限于本次通信的一次性密钥,下次通信时就不能使用了。像这样每次通信只能使用一次的密钥称为会话密钥(session key)。
相对于每次通信都更换的会话密钥,一直被重复使用的密钥称为主密钥(master key)。
一般来说,加密的对象是用户直接使用的信息(内容),这样的情况下所使用的密钥称为CEK (Contents Encrypting Key,内容加密密钥);相对地,用于加密密钥的密钥则称为KEK (Key Encrypting Key,密钥加密密钥)。
将密钥进行加密好像有点奇怪,但可以减少需要保管的密钥数量。
在很多情况下,之前提到的会话密钥都是被作为CEK使用的,而主密钥则是被作为KEK使用的。
防止破译过去的通信内容的机制,称为后向安全(backward security)。
不再需要的密钥必须妥善删除,因为如果被窃听者Eve获取,之前发送的加密邮件就会被解密。
基于口令的密码(Password Based Encryption, PBE )就是一种根据口令生成密钥并用该密钥进行加密的方法。其中加密和解密使用同一个密钥。
具有充足长度的密钥是无法用人脑记忆的。
在PBE中,我们通过口令生成密钥(KEK),再用这个密钥来加密会话密钥(CEK 由于通过口令生成的密钥(KEK)强度不如由伪随机数生成器生成的会话密钥(CEK),这就好像是将一个牢固的保险柜的钥匙放在了一个不怎么牢固的保险柜中保管,因此在使用基于口令的密码(PBE )时,需要将盐和加密后的CEK通过物理方式进行保护。例如可以将盐和加密后的 CEK保存到存储卡中随身携带。
在生成KEK时,通过多次使用单向散列函数就可以提高安全性。例如,如果我们将盐和口令先输入单向散列函数,然后将得到的散列值再次输入单向散列函数,将得到的散列值又再次 输入单向散列函数……像这样将经过1000次散列函数所得到的散列值作为KEK来使用,是一个不错的方法。
像这样将单向散列函数进行多次迭代的方法称为拉伸(stretching )。
如何生成安全的口令
使用只有自己才能知道的信息:不要使用对自己重要的事物的名字、不要使用关于自己的信息、不要使用别人见过的信息
将多个不同的口令分开使用
有效利用笔记:不可以将口令写在便签上然后贴在计算机的屏幕上。
理解口令的局限性:
口令是有局限性的。为了说明起来更简单,我们假设口令只能由8个字符的英文字母和数 字组成。英文字母和数字一共有62个,即:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
因此,8个英文字母和数字的组合的可能性为:
62 x 62 x 62 x 62 x 62 x 62 x 62 x 62
=628
=218340105584896
也就是大约218万亿种。这个数字虽然不小,但实际上只不过相当于一个长度为48比特的密钥而已。这个长度的密钥是可以通过暴力破解的。如果攻击者的计算机每秒可以生成并尝试 1亿个口令,则只需要25天就可以遍历所有的口令了。
使用口令生成和管理工具:这些工具通过随机数来生成难以推测的口令,并能够与浏览器联动在网站上自动输入相应的口令。我们也必须提防这些工具擅自盗用用户的口令。
2020-05-22