物格而后知至,知至而后意诚,意诚而后心正,心正而后身修,身修而后家齐,家齐而后国治,国治而后天下平 注册 | 登陆

什么是密码协议学——从案例的角度

    很多人不希望别人看到自己的一些信息,这包括你侄女写给她小男朋友的邮件,也包括美国国防部关于导弹部署的方案。不少习惯自己动手的人想弄清楚怎么样让信息变得安全,于是开始研究密码学,但他们发现总是不能如愿。为什么这样?一个原因是他们犯了一个错误:密码学并不等于密码算法学。

 

    第一个问题是,什么是密码学?

    有一种按照工作性质分类的方法是密码编码学和密码分析学:前者负责编制有效的加密方法,后者负责找这个方法的漏洞。编码人员和分析人员就像对手一样,整天算计着对方。

    而另一种分类则是按照研究内容来分的,分为密码算法学和密码协议学。密码算法学研究加密解密是怎么样对一个个字节操作的,而密码协议学则研究怎么样用这么多算法来搭建一个安全的方案。简单的说,前者研究细节,后者研究大局。

    这两种分类并不冲突,事实上,不论是密码算法学,还是密码协议学,都由编制和分析这两部分组成。

 

    我们来看一个例子,有点复杂,但是和你的金钱息息相关,相信你会很感兴趣。

    在商场使用信用卡或者银行卡消费时,售货员首先在POS机上刷一下她的卡,然后输入消费金额,接下来你输入密码,于是卡号、密码和消费金额一起加密,作为一个信息包(package)发送到了银行那里,以后把这个包叫做发送包。银行解密信息,查看你的卡号和密码是不是正确,然后检查余额是不是够支付,如果足够的话,扣除你要支付的数目,转到商场的账户里,然后返回成功的信息包,以后把这个包叫做接收包。POS机收到接收包并且显示交易成功。

    这个过程万无一失吗?下面我来例举一下可能出现的问题。

    一、如果银行迟迟没有给你返回消息,有这么几种可能:
    1.发送包在传输过程中丢失了;
    2.发送包在路上某个路由器那里阻塞了;
    3.接收包在传输过程中丢失了;
    4.接收包在路上某个路由器那里阻塞了。

    你所知道的仅仅是暂时没有收到成功信息,并不知道是哪种情况发生了,你能做出哪些选择呢?

    如果你放弃这次消费,在情况1的时候你的选择是正确的,但如果是2、3、4,银行将会或者已经扣除了你的钱,而你已经在柜台放弃了交易,没有拿到你要买的东西。
    如果你选择再支付一次,在情况1下你的选择仍然是正确的,如果是后面的情况,银行会忠实的两次扣掉你的钱,而不会理解你现实中的苦衷。
    如果你选择等待,这对于情况2、4是正确的选择,但是如果是某一个包丢失了呢?你得等到花儿都谢了……

    二、如果有一个人在半路上窃听发送包,他可以:
    4.试图解密发送包。如果他知道了你的卡号甚至支付金额——这些在商场都有记录,那么他要做的就是已知部分明文的解密,这是最糟糕的情况之一。最后他成功的得到了你的卡号和密码。
    5.他(站在商场一边,或者报复你)把发送包拦截下来,然后过一会儿又发到银行去,再过一会儿再发一次……于是银行可以一次又一次的在你账户里扣钱并转移到商场账户里去。以后银行可以拿出证据:你发送了这么多有效的信息包过来……结果往往是你输了官司。
    6.他(站在你这边,而报复商场)可以把发送包拦截下来,然后发送一个假的接收包给商场,于是你没有被扣钱,拿到了你的货物,而商场没有收到它应该得到的钱。

    现在,你还觉得使用信用卡支付万无一失吗?自从我开始考虑这个问题,每次用卡的时候都是胆战心惊的,但神奇的是,到目前为止我还没有碰到过问题,这太神奇了。

    其实,这就是密码学协议在里面工作着。所有的这些问题都不是密码算法能解决的,除了情况4。

    一个密码协议,是针对特定的事情,来规定一个过程怎么样实施,而一个好的密码协议,需要解决各种可能出现的问题。在商场购物用银行卡支付这个事情上,一个支付协议就至少要能应对上述的每一种情况,但绝对不仅仅是这些。

 

    密码协议学家们想到了一些很神奇的解决问题的方法:

    情况5中的这种攻击叫做重放攻击,解决的方法一般是用时间戳。在发送包里把当前时间和所有帐号信息一起加密,银行处理了第一个发送包,如果后来收到的包里的时间和其他信息都和刚才完全一样,就认为是同一个包,予以忽视。这个策略可以顺便解决情况6的问题。银行在接收包中将有效信息和发送包的时间同时加密,发回商场,而攻击者不知道确切时间,也就没法伪造一个接收包了。

    针对情况4,有一种策略是不发送密码,而验证你的身份。这有可能吗?可以这样操作:银行向你发送一个很大的随机数,你用hash函数计算一下密码和这个随机数。hash函数是一种算法,具有很好的性质,比如从答案算不出结果、不同的值算出来结果不同等等。你将答案发给银行,银行也将它保存的你的密码和刚才发的随机数用同样的方法算一下,然后检查是否一致。

    上面说的这种方法在你用ADSL上网的拨号过程中广泛使用,在那个时候,拨号服务器端三次向你发送随机数,你的拨号软件一一做出回答,如果三次都正确,那么你拨号就成功了。

    另外,大部分银行其实并没有保存你的密码,而是保存了你的密码经过一个hash函数计算得到的结果,每一次你去自动柜员机取款,输入密码,你的输入会经过同样的hash函数计算,然后把它与银行保存的进行对比。因此,你并不需要担心银行工作人员能得到你的密码,他们最多能得到hash函数的结果,而无法从中计算出密码。

    上面的这些,都是一些安全性的策略,也就是我们所说的协议。

 

    密码协议,与其说是一门学科,倒不如说是一场人和人比拼智慧的游戏。分析员不停的找出现有协议的漏洞,设计师则不停的弥补漏洞,设计更好的协议。他们两种人的差别也许并不是那么清晰,有可能就是一个人在那里自己给自己找麻烦,然后自己来解决它。

    如果你想有自己的保密措施,或者想了解坏蛋有些什么手段,或者想培养自己缜密的思维,你应该读一读密码协议学。如果你觉得已经有了非常严密的思维,那么强烈建议你试一试密码协议学是不是你未来的方向。

    在这里,我推荐Bruce Schneier写的《应用密码学(协议算法与C源程序)》,这本书的第二章到第六章讲得非常精彩,不需要什么基础知识就能明白,而且确实像一个个故事一样吸引人。

    最后,希望本文能对您有所帮助,由于准备不是很充分,不足之处,请您见谅。

标签: 密码协议, 安全

« 上一篇 | 顶部 | 首页 | 底部 | 下一篇 »

引用本文

点击获得Trackback地址,Encode: UTF-8 点击获得Trackback地址,Encode: GB2312 or GBK 点击获得Trackback地址,Encode: BIG5

1条记录访客评论

从来不敢用银行卡消费,自有我自己的道理。

Post by yinzhe on 2007, September 21, 6:37 PM 引用此文发表评论 #1


发表评论

评论内容 (必填):