一 保存密钥
1 人类无法记住密钥
首先必须要理解一个重要的事实,那就是人类是无法记住具有实用长度的密钥的。例如,像下面这样一个AES的128比特密钥,一般是是很难记住的。
51 EC 4B 12 3D 43 03 54 34 54 34 65 34 46 45 38
就算咬咬牙勉强记住了,也只不过是记住了一个密钥而已。但如果要自如地记住多个密钥并且保证不忘记,实际上时不可能做到的。
2 对密钥进行加密的意义
我们无法记住密钥,既然不能将密钥保存在自己的头脑中,那么就必须保存在其他某个地方。
于是现在就面临一个巨大的困难。为了保证机密性,我们将文件进行了加密,而解密用的密钥就相对于保证文件机密性的钥匙。然而,将密钥和密文存放在同一台计算机上时非常愚蠢的。如果主动攻击者能够访问保存密文件的计算机,那么攻击者就很有可能同时获取到密文和解密用的密钥。
我们记不住密钥,但如果将密钥保存下来又可能会被窃取。这个问题很难得到彻底解决,但我们可以考虑一些合理的解决方法。
其中一种种方法是,将密钥保存成文件,并将这个文件保存在保险柜等安全的地方。在这个场景中,我们是通过保险柜等其他装置来确保密钥的机密性的。
但放在保险柜里的话,出门在外时就无法使用。这种情况下,出门时就需要随身携带密钥。而如果将密钥放在存储卡里随身携带的话,就会产生存储卡丢失、被盗等风险。
万一密钥被盗,为了能够让攻击者花更多的时间才能够真正使用这个密钥,我们可以使用将密钥加密后保存的方法。当然,将密钥加密,必要需要另外一个密钥。像这样用于加密密钥的密钥,一般称为KEK。
既然加密密钥需要另外一个密钥(KEK),那么另一个密钥(KEK)又如何保存呢?我们又进入了死循环。
对密钥进行加密的方法虽然没有完全解决机密性的问题,但在现实中确是一个非常有效的方法,因为这样做可以减少需要保管的密钥数量。
举个列子,假设计算机上有100万个文件,分别使用不同的密钥进行加密生成100万个密文,结果我们手上就产生了100万个密钥,而要保管这100万个密钥是很困难的。
于是,我们用一个密钥(KEK)将这100万个密钥进行加密,那么现在我们只要保管这一个KEK就可以了。不过,这个KEK的价值就相对于前面这100万个密钥价值的总和。
用一个密钥来代替多个密钥进行保管的方法,和认证机构的层次化非常相似。在后者中,我们不需要信任多个认证机构,而只需要信任一个根CA就可以了。同样的,我们也不需要确保多个密钥(CEK)的机密性,而只需要确认一个密钥(KEK)的机密性就可以了。
二 作废密钥
1 为什么要作废密钥
举个例子,假设Alice向Bob发送了一封加密的邮件。Bob在解密之后阅读了邮件的内容,这时本次通信所使用的密钥对于Alice和Bob来说就不需要了。不再需要的密钥必须妥善删除,因为如果被窃听者获取,之前发送的加密邮件就会被解密。
2 如何作废密钥
如果密钥是计算机上的一个文件,那么仅仅删除这个文件是不足以删除密钥的,因为有一些技术能够让删除的文件“复活”。此外,很多情况下,文件的内容还会残留在计算机内存中,因此必须将这些痕迹完全抹去。简而言之,要完全删除密钥,不但要用到密码软件,还需要在设计计算机系统时对信息安全进行充分的考虑。
3 密钥丢了怎么办
如果包含密钥的文件被误删,或者保管密钥的笔记本电脑坏了,会导致怎样的后果呢?
如果丢失了对称密码的共享密钥,就无法解密密文了。如果丢失了消息认证码的密钥,就无法向通信对象证明自己的身份了。
公钥密码中,一般不太容易发生丢失公钥的情况,因为公钥是完全公开的,很有可能在其他电脑上存在副本。
最大的问题是丢失了公钥密钥的私钥。如果丢失了公钥密码的私钥,就无法解密用公钥密码加密的密文了。此外,如果丢失了数字签名私钥,就无法生成数字签名了。