Applied Cryptography:chapter 8 key management

   在密码安全方面,注重的就是秘钥算法,一个好的算法确实会让安全性大大的提升,但是同样的,秘钥的保存,也是至关重要的环节。
   个人设置密码时,要么用自己的相关信息,要么用某个本子或者某些东西记下来。官方或者密码安全性强一点的机构,就需要相当长的秘钥,并且要充分的随机,相对的,就不利于记忆了。那这些不利于记忆的密码当然需要存储,存储的安全性如何保证呢?

8.1 生成秘钥

密钥空间

一个56位的秘钥,有时候不能够全都用作密码,ms-dos强制使用ascii秘钥,这种秘钥需要最高位为0,程序还将小写字母转换为大写字母(因此每个字节的第5位总是与第6位相反),并忽略每个字节的低阶位,这样就相当于只是用了40位的空间存放秘钥。这样密钥安全性就会大打折扣,例如DES秘钥安全性就减少了一万倍。

弱秘钥选项

什么样的秘钥是比较弱的秘钥?Daniel Klein总结了一些,如下所述:
1、用户名,用户的首字母,账户名字,生日等相关个人信息可以作为秘钥。用户名或者在后面加个1,12,123什么的,例如:zhangfei123
2、某些数据库中的字符。例如类似公安部门的身份证信息,统计了所有人的姓名,生日的数据库。名人的名字,动漫和动漫人物名字,电影名字,其中的地点,小说中的人物,历史名著,神话鬼怪。
3、在2中的变化。大小写字母,大写变小写,小写变大写,名称的首字母缩写,单词倒写,“0”和"o"的置换,“l”和“1”的置换,“2”和“z”的置换,单词的话,可能会有单数复数之分,时态之分。
4、2中3没考虑到的变化。在java中,变量名称的设置会有一些习惯性的规则,比如:disPlay(),showName(),setName(),getName()。。在密码设置的时候,有时候也会有这样的习惯,例如zhangFei,LiSi,ZHANGsan
5、针对于中国人的密码,就是拼音了(外文书籍,所以前面所以规则都是相对于外国人设置密码的规则的,他们是没有拼音一说的),很多人喜欢使用自己的拼音当做密码,像我上面举例的密码一样。zhangfei,lisi
6、词组对,英文中总是有短语一说,例如in_additon,giveoff,getup,standup。这些可以相当于中文里的成语了,词组。还有一些俗语,歇后语等等。

随机秘钥 和 pass phrases

秘钥的随机性,非常的重要,从上述弱密钥的选项可以了解到,秘钥最安全的方法就是谁都不知道,自己都不知道的那种,那么随机秘钥不就是连自己都不知道了?所以最好的秘钥就是随机秘钥了。
秘钥随机性两条建议:
1、在秘钥中添加标点符号,例如@,’_+= ,,,这样大大加强秘钥
2、长字符串,取其缩写,例如“zhangfei”写成“zf”

pass phrases:将长句子转换为秘钥,这个长句子就可以被当成是pass phrases
例如:原句子:My name is Ozymandias, king of kings. Look on my works, ye mighty, and despair.
可以转换为下面的64位秘钥:
e6c1 4398 5ae9 0a9b
注意:原句子一定要容易记的,不能过一会儿就忘掉了,那么就没有任何意义了。

8.2 非线性密钥空间

军队中,你有一个加密机器,你不想这台机器落入敌人手中,还能够非常强大的加密解密,那么就可以设置特定格式的秘钥,一旦加密的格式不是特定的格式,则算法就会变得很脆弱,只有用特定的格式加密,算法将会很强劲。这就是非线性密钥空间
一种简单的方法是将密钥创建为两部分:密钥本身和使用该密钥加密的固定字符串。模块用密钥解密字符串;如果它得到固定的字符串,它就正常使用键,如果没有,它就使用不同的弱算法

8.3 传输秘钥

对称加密算法在产生秘钥之后,需要将己方的秘钥传递给对方,对方才可以使用改秘钥对密文进行解密,这使得传输秘钥成为了一个必须要考虑的事情。
秘钥传递可以选择多种途径,例如,秘密的邮箱,双方自己建立的互信通道,让值得相信的传递员传递秘钥,或者使用官方秘钥交换服务交换秘钥。
秘钥传输的时候,非常的危险,如果传递的信息十分重要的话,并且不相信任何的通道,传信员,那么怎么办呢?
1、x9.17中有两个类型的秘钥:秘钥加密秘钥数据秘钥
秘钥加密秘钥主要就是将需要传递的秘钥进行加密,并且分发出去,这让秘钥本身变得更加安全,难于被发现。数据秘钥是对于信息传递通道进行加密,在秘钥传递过程中,让通道更加的安全。
2、其实还有几种办法,可以将秘钥分成多分,然后将每一份都发出去,发给接收方,这样让接收方组合起来,就可以得到秘钥。或者不信人类的话,可以使用信鸽的方式。还可以直接打个电话,告诉对方。

8.4 确认秘钥

A和B通信,A向B发送一条消息,B如何才能确定,这条消息是A发过来的?
如果通过安全值得信任的途径发送过来,B可以确信。如果消息使用的是A的独特的秘钥加密的,那么B可以确信。如果消息上有A的数字签名,那么B也可确信。如果可信的机构分发的公钥加密的消息,B可以确信消息没有被拦截篡改。最后一条,还可以打个电话问问,是不是A发来的,声音也是一个可以值得确认的信息。

秘钥传输过程中的错误检测

传输过程中,如果秘钥出错了,或者被篡改了,那么一份百万兆的密文可能就直接打不开了,这不行,不是坑死?所以在传递过程中,要有一个错误检测的功能,一旦发生错误在接收后可以检测出来。

8.5 使用秘钥

软件加密是非常危险的,主要由于现如今加密完成以后的秘钥始终会停留在电脑中,甚至在电脑报废了,磁盘到修电脑的店里去,可能还会留存着当初使用的秘钥。
硬件加密就相对显得安全了许多。其中有一套机制,如果被篡改或者干扰以后,秘钥会被自动的删除,抛弃。会话秘钥是在一次会话,或者一次电话交谈之后就会被抛弃的。

8.6 更新秘钥

秘钥更新是非常的复杂的事,但是又是很多信息安全等级要求高的机构所强制要求的,那么怎么简化更新秘钥的事情呢?本书中使用单项函数对旧的秘钥进行操作,所得到的新的结果中抽取自己想要的部分作为新的秘钥,这样就会一直更新秘钥了。这一方法中,新秘钥的安全性和旧的秘钥的安全性相同,这就造成了,一旦旧的秘钥被其他人知晓了的话,就可以独自更新秘钥了。

8.7 存储秘钥

我们可以让某个人专门负责记忆这个秘钥,他的工作只有加密解密,一旦出错,那么责任也是这个人的,还有可以将密钥存储在磁条卡、嵌入ROM芯片的塑料密钥(称为ROM密钥),或这智能卡中。不多阐述。

8.8 秘钥泄密

本书中的密码学安全都是建立在了秘钥不泄露的前提下的。一旦秘钥泄露出去了,那么一切都是不安全的了。私钥是不可以泄露出去的,例如A的私钥一旦泄露出去,让C知道了,那么C就可以使用其私钥扮演A,然后与B进行交流了。
唯一的解决办法,就是尽可能的将私钥泄露的消息传递出去,让其他人谨醒,不要上当。

8.9 秘钥生命周期

8.10 销毁秘钥

8.11 公钥秘钥管理

公钥非常有益于秘钥管理,但是唯一的缺点就是传递消息,秘钥数量太多了,我和你传递消息,我有公钥私钥,你有公钥私钥,我需要你的公钥加密我的信息,并且发给你,你用私钥解密。你给我发消息也是同样的,需要用我的公钥加密,再发给我。
第三个人在中间拦截了公钥和私钥,将你的公钥换成他的公钥,我就是使用的第三人的公钥加密,发送给你,但是他继续拦截,他解密后查看了消息,用你的公钥加密,之后再发给你。第三人就像一个中间拦截器一样,把所有消息都看了个光。

公钥认证

在这个时候,就需要对这种攻击方式做一个防范了。那就是对于公钥进行一个认证,在公钥管理中心中,公钥和其主人的姓名,地址等等信息保存在一起,起到一个签名的作用,这样B获取上述人的公钥的时候,就可以直接通过认证就知道自己拿过来的公钥是正确的了。
但是公钥和主人信息的联结,有需要一个CA这样的机构来确认信息是否正确,如果信息是正确的,那么公钥密码就没有任何问题了。

分布式秘钥管理

上述使用的CA,也就是中间认证机构,但是如果A和B都没有信任的CA,怎么办?
B可以找一些信得过的介绍人,让他们对B的信息和B公钥进行一个认证,并且留下签名,这样A如果也听说过这些认证人,并且也信得过这些人的话,就可以完成B公钥的认证了。(这居然叫分布式秘钥管理)
这是A和B没有信任的认证机构,可以完成的操作。但是漏洞太大了。
中间认证人,需要A和B都认识,并且都信任。为了这两点,B不得不多找一些介绍人来证明自己,那么无形之中就增加了风险。
例如,公证人表面上公正严明,别人都信他,但他不干人事,内心龌龊,用自己的公钥和B的信息一捆绑,签上自己的名字,并且发送给D,那么D就会以为一直在跟B通信了。

猜你喜欢

转载自blog.csdn.net/wangzhiyu12/article/details/107633327
今日推荐