Posted on 2009-12-03 17:55
深夜两点 阅读(780)
评论(0) 编辑 收藏
大学时候学网络安全,不知道是老师太脱离实际,还是当时我上课睡太多了,反正学了个糊里糊涂。上机实验比着葫芦画瓢在JBoss上搞了个EJBCA的什么东西,就觉得已经混过去了。不过该学的还是得学,躲不过。现在开始还大学睡觉的债。。。。前段时间看了一阵子的Java安全编程,回过头来总结总结。
首先是跟Java没关系的,是加密和认证。加密的算法可以分为三类:
- 摘要算法(指纹算法,哈希算法等):摘要算法其实不算加密。算法以数据为输入,生成一串等长的输出。这个输出就是这段输入的指纹,或者说是摘要。算法不管输入有多长,1G或者一个byte,输出都是一样长的。指纹算法比较形象。我们可以认为,只要数据不同,生成的摘要就是不同的(或者说,想根据一个摘要来生成特定的数据是很难的,所以这个摘要可以唯一的确定数据的身份)。当然是无法从这个简短的摘要还原原始数据的。比较常用的摘要算法有MD5,SHA-1,DSA之类的。摘要算法是公开的,任何人都可以通过摘要算法来计算一段数据的摘要。所以,如果一个文件传输给你,同时也给你一个这个文件的MD5摘要,那么你收到文件后,计算一下文件的MD5,然后和别人给你的MD5摘要比较一下,就知道文件在到你手上之前是不是被人改动过了。
- 对称加密算法:对称加密算法是使用相同密钥加密和解密数据的一种加密算法。密钥可以认为就是一段数据。使用相同的密钥这点很重要。对称加密算法很多,加密解密也很快。最入门的对称加密算法就使凯撒密码。工业中使用的加密算法很多,比如用于流加密的RC4,还有AES,DES等。只有有密钥,那么就可以对加密后的数据进行解密,得到原始的数据。从这里可以看出,密钥是对称加密的关键,如果密钥的传输无法保证安全,对称加密就是形同虚设的。
- 非对称加密算法:非对称加密算法是计算机加密和认证中最关键的一环。非对称加密的特点是,它有俩密钥,用密钥1加密的数据需要使用密钥2解密,同样,用密钥2加密的数据需要用密钥1解密。如果公开密钥1,那么密钥1就成为公钥,即公开的密钥,同时,密钥2就使私钥,必须好好保存不能让别人得到。非对称加密算法有数学证明来保证它几乎不可能在一个有意义的时间段内被破解。但是非对称加密也有致命的弱点——加密解密计算量大,不适合用来处理大量的数据。非对称加密算法有RSA,DSA等。
计算机加密体系需要保证——保密性、完整性、认证性和不可抵赖性。保密性就是说,数据是使用加密算法加密过的(一般是使用对称加密算法加密)。完整性可以用摘要算法保证,因为一段数据一旦被人改动过了,那么摘要就肯定不同了。但是,这两者如果没有非对称加密算法保护,一切就都是空谈。因为,密钥总归要通过 internet传输的,如果被人窃取了咋办?摘要?大不了黑客篡改了数据之后,生成一个新的摘要。好,非对称加密上场了,认证性和不可抵赖性这两点也是非对称加密来保证的。它如何来保证前面这些呢?
先看看什么是证书。有了这些算法之后,就有了证书这个概念。啥叫做证书呢?证书其实就是一个文件。文件内容挺多,需要关心的有:
- 非对称加密的公钥。它可以用来解密那个秘密的私钥加密过的数据。
- 用别的私钥加密过的非对称加密的公钥的签名。上面说的非对称加密的公钥也是一段数据呀,用摘要算法计算一下它的摘要。然后用别的私钥加密一下这个摘要。注意,这里说的是用别的私钥加密。
- 所谓的别的私钥的标识。有了这个标识,才知道是谁加密了公钥的签名。
问题越来越多了。什么叫做别的私钥?哪儿来的私钥?对于一个有效的证书来说,这里说的别的私钥,就是那些专门来提供证书加密服务的公司(比如 VeriSign)的私钥。这些公司会全副武装的保护好自己的私钥(公司的命根子呀)。下面来叙述一下这个过程:
- 首先,A公司想要一个证书,用来在internet上证明自己确确实实是A公司。于是公司通过工具生成了一对密钥(这个很简单,谁都可以轻松的生成一对密钥)。
- 然后他拿着公钥去找VeriSign,计算了公钥的MD5值,请求VeriSign拿出自己的宝贝私钥,来对这个公钥的MD5值进行加密。
- VeriSign很专业,他们会要求A公司出具相应的证明,核实无误后,VeriSign此才会拿出私钥,把A公司公钥的MD5值进行加密。这个就叫做签发证书。
- 这不是一锤子买卖,A公司为了这个事儿,须要按年给VeriSign付钱。
- 好,A公司的公钥的MD5值被VeriSign的私钥加密过了,得到了一段加密后的数据,只有VeriSign的公钥才能解密这段数据,得出正确的值。
- A公司屁颠屁颠的可以生成自己的证书了,证书的内容包括:
- A公司的公钥。
- VeriSign的私钥对A公司的公钥的MD5值加密后,所得到的数据。再次提醒一下,这个密钥只有VeriSign的公钥才能解密。
- 一段文字,说明证书是VeriSign验证的,公钥的指纹算法是MD5。这段文字不用加密,谁爱看谁看。
终于A公司有了自己的证书,但是,VeriSign的私钥加密过的东西,须要使用VeriSign的公钥来解密,咋办?不用急,VeriSign这种提供证书服务的公司早就和各种操作系统提供商协商好了,他们的公钥早就一经包含在了每一个操作系统中,在我们安装操作系统的时候,VeriSign这些公司的公钥就已经包含在计算机里了。
下面以https来解释一下计算机中的安全体系(保密性、完整性、认证性和不可抵赖性)是如何工作的。
A公司有了一个站点,浏览器使用https来访问这个站点的时候,大概的过程就是这样的(下面的过程基本是Https协议的运作过程):
- A公司站点首先给客户端发送自己的宝贝证书。(数据传输的时候被人从中间截获了?不怕,想听就听吧)
- 认证性:客户端得到证书之后,开始验证这个证书:
- 首先,客户端从证书中知道,这个证书是被VeriSign公司签发的。所以客户端从操作系统中拿出来VeriSign公司的公钥,待用。
- 客户端还知道,A公司公钥是使用MD5算法计算的签名,OK,客户端读取出来证书中A公司的公钥,使用MD5值,待用。
- 下面是重要的一步了,客户端从A公司的证书中抽取出那段加密后的数据(也就是A公司公钥的MD5值被VeriSign公司的私钥加密过的那段数据),然后再拿过来第一步中找到的VeriSign公司的公钥,非对称加密的特点就是私钥加密,公钥解密之。所以,当当当当当,解密之,得到的值就应该是A公司的公钥的MD5值。< /li>
- 那到底是不是呢?跟第二步中客户端自己计算出来的MD5值比对一下就知道了。
- 如果通过比较,发现确实是,那么安全体系中的认证性就得到保证了,也就是说,客户端可以完全相信对方就是A公司,访问的站点也就是A公司的站点。(等等,A公司的公钥不是公开的吗?那岂不是任何站点都可以伪装成A公司?不急,这不是个事儿,在下面不可抵赖性会说到)当然,如果验证不通过,说明对方是个“李鬼”。浏览器会有提示,说这个站点提供的证书没有通过验证思密达(还有一种情况就是,证书过期了,还记得前面说的每年给VeriSign的年费吗)。
- 好,客户端验证通过了,下面就是开始传输数据了。传输数据的过程有保密性、完整性和不可抵赖性三点需要保证。
- 首先,客户端浏览器悄悄地生成一个随机数。然后使用A公司的公钥加密这个随机数,发送给A公司的站点。因为是A公司公钥加密的,所以不怕被人窃听。为啥不怕被窃听,因为窃听了也没用,因为窃听者肯定没有A公司的私钥,没有私钥也就没法对窃听到的数据解密。
- A公司站点收到这个数据后,开始使用自己的私钥解密数据。到了这个时候,肯定是只有客户端和A公司的站点服务器知道这个随机数的。
- 接下来,客户端浏览器和A公司站点根据相同的算法,生成对称加密使用的密钥(实际上是一组密钥,当然在这里不用深究这个)。以后的数据传输就全使用这个对称加密密钥进行了。这就是保密性。
- 保密性得到了保证,完整性如何保证呢?如果攻击者虽然不能够获得数据,但是他想捣蛋,偷偷篡改数据来破坏数据的完整性。这个时候也没啥问题,在https 协议中,每条消息在加密之前都包含了消息内容和消息的hash值(比如,消息的MD5值),这样在消息的接收端,就可以对这条消息进行验证了。通过验证就可以知道消息是不是被篡改过。当然,如果被篡改过,也使没办法回复的,不过知道消息被篡改过,那么就可以要求对方重新发送消息了,总之攻击者是没法办得逞的。这就是消息的完整性。
- 好的,在这里我们来看一下不可抵赖性。因为只有A公司有私钥,这也就是说,只有A公司可以把这个数据成功解密,来得到这个随机数,从而来计算对称加密使用的密钥。所以,如果A公司想抵赖说那个站点不是自己,是不可能的事情。因为只有A公司有这个用于解密的私钥,不是A公司是谁。同样,就好像在前面说的,如果有人用A公司的公钥冒充A公司,那么这个李鬼其实没有A公司的公钥,也就没有办法解密数据(注意,客户端产生的随机数是使用A公司的公钥加密的,须要使用A公司的私钥解密),所以这个是徒劳的。
好,保密性、完整性、认证性和不可抵赖性都在上面的过程中都得到保证了。这个过程的核心就是非对称加密的特性:公钥加密私钥解密,私钥加密公钥解密。本篇到此结束,下一篇中将涉及Java中的认证和加密。
关于https的具体内容可以参考这篇文章:http://www.infoq.com/cn/articles/HTTPS-Connection-Jeff-Moser