ssl 安全原理思考

来源:互联网 发布:oracle清除表数据 编辑:程序博客网 时间:2024/06/06 08:43
 

 在讨论ssl的原理之前,我们先来回顾一下各种加密方法以及数字证书

明文传输

 

                     “转帐50000到tim的帐号”

Client kin --------------------------------------------> server ken

                

                    “转帐ok,50000将从你的帐户扣除”

Client kin <-------------------------------------------- server ken

 

1    数据没有任何保密性----只要网络传输中途任何地方都可以被窃取,万一kin转给tim的这50000元的行为是非法行为,被网络警察获取这个信息的话后果很严重

2    数据的完整性没法保证----网络中途有可能被人修改成转帐500000

3    身份无法鉴别----不能确认收到这个信息就一定是ken ,万一是钓鱼网站或是被其他人冒充ken的server,server端也不能确认信息就是kin发送过来的

4    不可否认性差----kin发了这个信号但事后不承认是自己发的,要求ken赔偿50000元,或ken事后不承认是自己收到了kin的请求而扣掉了他50000元

 

总结: 明文传输最好不要用于做任何商业行为,我们公司的产品目前没有使用明文传输这种方式的

 

古典密码

古典密码都是基于字符的密码算法构成的,不同的密码算法是字符之间相代换或者是互相置换,或代换与置换相互结合,位运算其实也是属于这一种方式

 

                     “**CAAAA*567****”

Client kin --------------------------------------------> server ken

                

 

                     “***,CAAAA将*****”

Client kin <-------------------------------------------- server ken

                

1     数据保密性比较弱----容易被破解

2     数据的完整性没法保证----网络中途还是有可能被人修改成转帐500000,假如CAAAA代表50000,例如把CAAAA修改成CAAAAA

3     身份无法鉴别----不能确认收到这个信息就一定是ken ,万一是钓鱼网站或是被其他人冒充ken的server,server端也不能确认信息就是kin发送过来的

4    不可否认性差----kin发了这个信号但事后不承认是自己发的,要求ken赔偿50000元,或ken事后不承认是自己收到了kin的请求而扣掉了他50000元

 

总结:古典密码传输依然不能满足商业行为的要求,只能在网络传输过程中起到一定的保密作用,

对称加密

对称加密:简单的说就是加密密钥与解密密钥相同,对称加密的速度比较快。

对称加密又分分组密码和序列密码。

Ø  分组密码是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运算),还原成明文组。分组密码的典型例子为DES,RC5,IDEA。

Ø  序列密码是指利用少量的密钥(制乱元素)通过某种复杂的运算(密码算法)产生大量的伪随机位流,用于对明文位流的加密。解密是指用同样的密钥和密码算法及与加密相同的伪随机位流,用以还原明文位流。序列密码的典型例子为RC4。

 

 

最常用的是DES加密算法:

 

                “士%#$大夫了%#$@@@!HGH大夫”

Client kin --------------------------------------------> server ken

 

                 “%^&&**%$YH嗄窘叠鲵”

Client kin <-------------------------------------------- server ken

 

                

1    数据保密性强----在不知道密钥的情况下将密文破解的可能性几乎为0

2    数据的完整性依然不是百分百可靠----网络中途还是有可能被人修改,万一运气不好被人胡乱改了密文后,再经过密钥解密后变成转帐500000也不是不可能,另不能保证数据传输是否完整无缺

3    身份鉴别----不能确认收到这个信息就一定是ken ,有可能被知道密钥的人冒充ken的server,如果密钥除kin以外的人也知道那么依然server端也不能确认信息就是kin发送过来的。当然如果只有kin 跟ken知道密钥,那么kin只有在有证据证明自己没有冒充ken的情况下才能证明信息一定是ken收到了,而ken只有在有证据证明自己没有冒充kin发送信息的时候才能证明信息一定是kin 发的,可见单独使用DES加密的方法来做身份鉴别依然十分的不方便。

4    不可否认性----kin发了这个信号但事后不承认是自己发的,说可能是其他知道密钥的人发送的,要求ken赔偿50000元,或ken事后不承认是自己收到了kin的请求而扣掉了他50000元,说有可能是其他知道密钥的人收到了kin的信息,并将他的50000元扣掉了。如果只有kin 跟ken知道密钥那么他们又得有充分证明自己没有冒充对方的证据的情况下才能让对方不可否认。可见单独使用DES加密的方法在不可否认性方面依然不方便。

 

 

总结:DES加密在网络传输过程中保密性非常强,直接在网络中途获取到密文,在不知道密钥的情况下不可能被破解,但在数据完整性,身份鉴别,不可否认性这几个方面使用起来依然有缺陷。

 

非对称加密

简单的说就是加密密钥与解密密钥不同,分私钥和公钥。非对称加密的速度比较慢。一般用于密钥交换,RSA便是一个我们熟知的例子。

RSA公钥加密在计算机产业中被广泛使用在认证和加密。公钥加密是使用一对非对称的密码加密或解密的方法。每一对密码由公钥和私钥组成。公钥被广泛发布。私钥是隐密的,不公开。用公钥加密的数据只能够被私钥解密。反过来,使用私钥加密的数据只能用公钥解密。

RSA加密:

                “士%#$大夫了%#$@@@!HGH大夫”

Client kin --------------------------------------------> server

 

                 “%^&&**%$YH嗄窘叠鲵”

Client kin <-------------------------------------------- server ken

 

 

              

1    数据保密性强----在不知道公钥的情况下要将经过私钥加密的密文破解的可能性几乎为0,同样在不知道私钥的情况下要将经过公钥加密的密文破解的可能性也几乎为0

2    数据的完整性依然不是百分百可靠----网络中途还是有可能被人修改,万一运气不好被人胡乱改了密文后,再经过公钥或私钥解密后变成转帐500000也不是不可能,另不能保证数据传输是否完整无缺

3    身份鉴别强----如果kin 使用公钥加密发送给ken的,那么肯定能确认收到这个信息就一定是ken,因为只有ken知道私钥 ,其它人不可能冒充ken的server。因为公钥被广泛发布,所以kin以外的人也是知道公钥的,那么kin如果信用不好,他也可以否认自己曾经发过这个信息给ken 。反过来如果kin 使用私钥加密发送给ken的,同样ken也可以否认自己收到这个信息,因为公钥很多人都知道,但kin却不能否认他自己发送过这个信息,因为只有他才有私钥,只要能用公钥解密正确就证明一定是kin发的

4    不可否认性强----同3中描述,只要公钥解密正确那么就能证明一定是私钥的拥有者发送的信息或收到了信息,当然如果私钥被盗,那么只能是私钥的拥有者来承担责任了

 

 

总结:RSA加密在网络传输过程中保密性非常强,直接在网络中途获取到密文,在不知道公钥或私钥的情况下不可能被破解,在身份鉴别,不可否认性方面非常强,只要公钥解密正确那么就能证明一定是私钥的拥有者发送的信息或收到了信息,但在数据完整性,这方面依然有缺陷。

 

 

单向散列函数

Des加密跟rsa加密都不能完全解决数据的完整性方面的缺陷,

 

 由于信道本身的干扰和人为的破坏,接受到的信息可能与原来发出的信息不同,一个通用的办法就是加入校验码。

 

日常中我们经常使用校验和来验证传输的信息是否被修改过或丢失过内容,

校验和的原理一般是使用位运行,使用二进制求和的算法来计算,tcp协议中的校验和也是使用了二进制求和的算法来计算的。但这种办法依然是不可靠的,因为信息有可能在网络中途被修改过后,但用修改后的信息来计算校验和跟修改前的信息来计算的直确一样

 

而单向散列函数就是为了解决这个问题而生的,单向散列函数的算法可以确保只要信息有任何一处被修改,那么计算出来的摘要就会跟修改前完全不一样。
  单向散列函数,一个典型的例子是我们熟知的MD5,它产生128位的摘要,在现实中用的更多的是安全散列算法(SHA),SHA的早期版本存在问题,目前用的实际是SHA-1,它可以产生160位的摘要,因此比128位散列更能有效抵抗穷举攻击。

 

MD5:

              “|^&&76&GT%$#$^&**|转帐50000到tim的帐号|”

Client kin ---------------------------------------------------> server

 

Kin在发送给ken的信息前先将“转帐50000到tim的帐号” 这个信息计算出一个摘要,ken收到这个信息后,取出摘要信息,然后再将后面的信息按照kin计算摘要时使用的算法从新计算一遍,如果ken计算的摘要跟kin计算的一样,那么就证明信息在网络中途没有被修改过,也没有丢失
  

这里有一个缺陷是:单向散列的算法都是公开的,在网络中途如果黑客窃取了这个信号, 他可以先改动原文为转帐500000,再生成另外一份摘要把原本的摘要替换掉,这样ken收到信号后依然会认为信息没有被修改。

 

 

 

对称加密,非对称加密,单向散列函数的组合运用

DES加密优点: 速度快,网络传输中途保密性强

DES加密缺陷: 保证数据完整性,身份鉴别,不可否认性这几个方面弱

 

RSA加密优点: 网络传输中途保密性强,身份鉴别,不可否认性强

RSA加密缺陷: 速度慢,保证数据完整性性弱

 

MD5算法优点: 保证数据完整性非常强

MD5算法弱点: 由于单向散列的算法都是公开的,所以其它人可以先改动原文,再生成另外一份摘要。

 

 

可见上面的每一种技术都有各自的优点和缺点,那我们如果将他们的优点组合起来的话就可以形成一个完美无缺的网络传输加密方案了

 

我们还以kin向ken传送“转帐50000到tim的帐号”这个信息为例子

方案一

(前提:ken跟kin都拥有相同的DES密钥)

1 首先kin可以使用MD5算法算法给这个信号计算出一个摘要

2 kin再使用DES加密算法将 “摘要+信息”一起传送给ken

这样黑客再网络中途就算获取到信息,由于他不知道des密钥,所以他没办法同时修改原文以及用修改后的原文来生成摘要了

有了1,2之后,但还是有身份鉴别弱,以及不可否认性差的缺陷

方案二

前提ken有一个RSA私钥,而且kin拥有有一个与ken私钥对应的RSA公钥,那么我们再改成下面的步骤:

1 首先kin可以使用MD5算法给这个信号计算出一个摘要

2 kin再使用RSA公钥算法将 “摘要+信息”一起传送给ken

这样黑客再网络中途就算获取到信息,由于他不知道RSA私钥,所以他没办法同时修改原文以及用修改后的原文来生成摘要了,而且ken也没有办法否则自己没有收到kin的消息,kin也不需要担心自己的信号是否发给了别人,就算发给了别人也没关系。

此方案依然有下面的缺陷:

A kin必须事先知道RSA公钥,

B 如果kin与ken之间要多次进行交互,每次使用RSA加密,速度太慢,效率不高

C ken如果处理了这个信息,那么ken不可否认自己收到并处理了这个信号,但kin确可以否认自己发送了这个信号,因为RSA公钥可能不止kin知道

 

方案三

 

前提ken有一个RSA私钥,而且kin拥有有一个与ken私钥对应的RSA公钥,那么我们再改成下面的步骤:

 

1 首先kin可以使用MD5算法给这个信号原文计算出一个摘要

2 kin自己生成一个DES密钥

3 kin使用RSA公钥,将2中的DES密钥加密后发送给ken,然后跟ken协商好之后就用这个DES密钥来加密我们之前传输的信息,如果ken回复ok则表明对方一定是ken

4 kin再使用与ken协商好DES密钥将 “摘要+信息”一起加密后传送给ken

 

按照上面4个步骤之后,只比方案二改善了RSA加密速度太慢的问题

依然有下面2个缺陷:

A kin必须事先知道RSA公钥

B ken如果处理了这个信息,那么ken不可否认自己收到并处理了这个信号,但kin确可以否认自己发送了这个信号,因为RSA公钥可能不止kin知道

 

要解决B这个缺陷比较简单,我们可以多搞一对RSA公钥,私钥,RSA公钥事先给ken,私钥事先给kin。Kin在与ken通讯时,kin先验证完对方是ken后,ken再验证对方是否就是kin,这样双方就不可以否认自己了,这样还剩下最后一个缺陷:

A kin必须事先知道ken 的RSA公钥,而ken也必须事先知道kin的RSA公钥

 

 

要解决这个问题就优点麻烦了,详细解决办法见下:

数字证书 

我们在信息处理中的应用一般的流程可以是这样:
  假设我们有两个消息方kin和ken
  1. kin要ken发消息,首先要求由ken传递给kin一个属于ken的公钥。
  2.然后kin再用ken的公钥加密消息然后传递给ken。
  3.ken用自己的私钥解密消息得到明文。

  然而这个流程还是有一定的问题,首先对消息加密本身没有问题,但是会被另一种攻击,假如tim是一名黑客,因为事先kin并没有ken的公钥,那么他一般的情况下是直接使用明文来向ken请求公钥,那么tim在中间可以截获kin要求ken传递公钥的消息,  然后tim可以自己构造一个公钥给kin,然后再用自己的私钥跟kin进行通讯,而kin还一直以为在跟ken进行通讯。

 

解决这个问题的办法有2个:

 

1  让kin事先知道ken的公钥,这样kin就不需要向ken请求公钥 ,这样黑客也不能够通过截获请求公钥的明文消息而构造自己的公私钥对来与kin进行通讯

2  如果kin事先不知道ken公钥  ,那么可以使用数字证书

 

数字证书原理:

 

假设kin  ken都非常信任 song,song是一个权威,song有一对公钥,私钥对,私钥只有song自己知道,而公钥可以给kin ,以及ken知道,

 

Ken可以向song申请一个证明A:

1 这个证明里面包括ken的公钥,

2 这个证明里面包含了song对这个证明的签名(签名所使用的方法是利用前面讲过的单项散列函数的算法对证明计算出一个摘要,然后再用song的私钥将这个摘要进行加密)

3 这个证明里面列出了第2项中使用的单项散列函数的算法

4 这个证明里面包含了证书的有效期以及证明拥有者的名字等其它信息

 

证明中有了这些信息后,如果kin拿到证明A那么他就可以利用song的公钥来充分证明这个证书是否就是song签发的,使用的办法是:

1         kin检查是否能用song的公钥将证书中的摘要内容解密开来,

2         kin检查是否解密后的摘要与song加密之前的摘要是一样的。那么kin怎么知道加密之前的摘要呢? 答案就是证书中有列明了song使用的单项散列函数的算法,kin使用这个算法再对证书计算一遍摘要,这样就得到了加密之前的摘要。如果解密后的摘要与song加密之前的摘要是一样的这样且充分证明证书是song签发的而且没有被修改过的。

 

那么kin事先不知道ken的公钥的情况下,他可以先向ken请求出示song签发给ken的证明A,然后再使用song的公钥来验证证明A是否的确是song签发的,这样黑客就没办法来冒充ken了,因为song不会给黑客制造同样的证明,这里需要明白一个关键是:kin如何使用song的公钥来证明A就是song签发给ken的,另kin要事先知道song的公钥,

 

那么有人会问事先知道song的公钥,还不如直接知道ken的公钥算了 搞得这么麻烦,但想象一下,如果kin要跟很多个类似ken 这样的server来通讯,那么kin要保存很多个公钥,但如果使用数字证书这种方式,kin就只需要知道song的公钥就行,类似ken的所有这些sever都向song去申请一个证明就行了。

 

 

上面所讲的就是数字证书使用的原理,song给ken签发的这个证明则是数字证书, song就是一个CA机构,kin在跟ken交互前要事先安装song的根证书,根证书里面就包含了song的公钥

 

SSL工作原理

 

SSL是一个介于HTTP协议与TCP之间的一个可选层,其位置大致如下:
  
  ---------
  | HTTP |
  ---------
  | SSL |
  ---------
  | TCP |
  ---------
  | IP |
  ---------

协议概述
  安全套接层协议(SSL)是在Internet基础上提供的一种保证私密性的安全协议。它能使客户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对客户进行认证。SSL协议要求建立在可靠的传输层协议(例如:TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的。高层的应用层协议(例如:HTTP,FTP,TELNET。。。。。。)能透明的建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商以及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。
  通过以上叙述,SSL协议提供的安全信道有以下三个特性:
  ? 私密性。因为在握手协议定义了会话密钥后,所有的消息都被加密。
  ? 确认性。因为尽管会话的客户端认证是可选的,但是服务器端始终是被认证的。
  ? 可靠性。因为传送的消息包括消息完整性检查(使用MAC)。
  三.协议规范
  SSL协议由SSL记录协议和SSL握手协议两部分组成。
  1. SSL记录协议:
  在SSL协议中,所有的传输数据都被封装在记录中。记录是由记录头和长度不为0的记录数据组成的。所有的SSL通信包括握手消息、安全空白记录和应用数据都使用SSL记录层。SSL记录协议包括了记录头和记录数据格式的规定。
  1) SSL记录头格式:
  SSL的记录头可以是两个或三个字节长的编码。SSL记录头的包含的信息包括:记录头的
  长度、记录数据的长度、记录数据中是否有粘贴数据。其中粘贴数据是在使用块加密算
  法时,填充实际数据,使其长度恰好是块的整数倍。最高位为1时,不含有粘贴数据,记
  录头的长度为两个字节,记录数据的最大长度为32767个字节;最高位为0时,含有粘贴
  数据,记录头的长度为三个字节,记录数据的最大长度为16383个字节。
  当数据头长度是三个字节时,次高位有特殊的含义。次高位为1时,标识所传输的记录是
  普通的数据记录;次高位为0时,标识所传输的记录是安全空白记录(被保留用于将来协
  议的扩展)。
  记录头中数据长度编码不包括数据头所占用的字节长度。记录头长度为两个字节的记录长度的计算公式:记录长度=((byte[0] ; 0x7f) <;<; 8)) | byte[1]。其中byte[0]、byte[1]分别表示传输的第一个、第二个字节。记录头长度为三个字节的记录长度的计算公式:记录长度=((byte[0] ; 0x3f) <;<; 8)) | byte[1]。其中byte[0]、byte[1]的含义同上。判断是否是安全空白记录的计算公式:(byte[0] ; 0x40) != 0。粘贴数据的长度为传输的第三个字节。
  2) SSL记录数据的格式:
  SSL的记录数据包含三个部分:MAC数据、实际数据和粘贴数据。
  MAC数据用于数据完整性检查。计算MAC所用的散列函数由握手协议中的CIPHER-CHOICE消息确定。若使用MD2和MD5算法,则MAC数据长度是16个字节。MAC的计算公式:MAC数据=HASH[密钥,实际数据,粘贴数据,序号]。当会话的客户端发送数据时,密钥是客户的写密钥(服务器用读密钥来验证MAC数据);而当会话的客户端接收数据时,密钥是客户的读密钥(服务器用写密钥来产生MAC数据)。序号是一个可以被发送和接收双方递增的计数器。每个通信方向都会建立一对计数器,分别被发送者和接收者拥有。计数器有32位,计数值循环使用,每发送一个记录计数值递增一次,序号的初始值为0。
  2. SSL握手协议:
  SSL 连接总是由客户端启动的。在SSL 会话开始时执行 SSL 握手。此握手产生会话的密码参数。关于如何处理 SSL 握手的简单概述,如下图所示。此示例假设已在 Web 浏览器 和 Web 服务器间建立了 SSL 连接。

图 SSL的客户端与服务器端的认证握手


 

(1) 客户端发送列出客户端密码能力的客户端“您好”消息(以客户端首选项顺序排序),如 SSL 的版本、客户端支持的密码对和客户端支持的数据压缩方法。消息也包含 28 字节的随机数。

(2) 服务器以服务器“您好”消息响应,此消息包含密码方法(密码对)和由服务器选择的数据压缩方法,以及会话标识和另一个随机数。
   注意:客户端和服务器至少必须支持一个公共密码对,否则握手失败。服务器一般选择最大的公共密码对。

(3) 服务器发送其SSL数字证书。(服务器使用带有 SSL 的 X.509 V3 数字证书。)
     如果服务器使用 SSL V3,而服务器应用程序(如 Web 服务器)需要数字证书进行客户端认证,则客户端会发出“数字证书请求”消息。在 “数字证书请求”消息中,服务器发出支持的客户端数字证书类型的列表和可接受的CA的名称。

(4) 服务器发出服务器“您好完成”消息并等待客户端响应。

(5) 一接到服务器“您好完成”消息,客户端( Web 浏览器)将验证服务器的SSL数字证书的有效性并检查服务器的“你好”消息参数是否可以接受。
    如果服务器请求客户端数字证书,客户端将发送其数字证书;或者,如果没有合适的数字证书是可用的,客户端将发送“没有数字证书”警告。此警告仅仅是警告而已,但如果客户端数字证书认证是强制性的话,服务器应用程序将会使会话失败。

(6) 客户端发送“客户端密钥交换”消息。此消息包含 pre-master secret (一个用在对称加密密钥生成中的 46 字节的随机数字),和 消息认证代码 ( MAC )密钥(用服务器的公用密钥加密的)。
    如果客户端发送客户端数字证书给服务器,客户端将发出签有客户端的专用密钥的“数字证书验证”消息。通过验证此消息的签名,服务器可以显示验证客户端数字证书的所有权。
   注意: 如果服务器没有属于数字证书的专用密钥,它将无法解密 pre-master 密码,也无法创建对称加密算法的正确密钥,且握手将失败。

(7) 客户端使用一系列加密运算将 pre-master secret 转化为 master secret ,其中将派生出所有用于加密和消息认证的密钥。然后,客户端发出“更改密码规范” 消息将服务器转换为新协商的密码对。客户端发出的下一个消息(“未完成”的消息)为用此密码方法和密钥加密的第一条消息。

(8) 服务器以自己的“更改密码规范”和“已完成”消息响应。

(9) SSL 握手结束,且可以发送加密的应用程序数据。

 

 

 

SSL编程:

请参考:

http://www.yuanma.org/data/2007/1203/article_2904.htm

 

http://www.yuanma.org/data/2007/1203/article_2904_1.htm

 

 

 

最后总结一次:

有了ssl协议这一层次,只要在私钥保密的情况下,就可以完全保证通讯的绝对可靠以及安全

无论使用对称加密 还是非对称加密还是采用数字证书 还是采用其它办法,还是所有这些办法组合还是直接使用ssl协议,都不是绝对安全的,绝对的安全要依赖与密钥只能被自己使用而不会暴露给别人,那我们有什么办法只让自己使用密钥呢? 

 

如果你的密钥要在电脑上用来加解密,而且你的电脑可以由internet接入,那么你的密钥就有可能被别人窃取,那么这就不是绝对安全的

 

绝对安全的办法是将密钥放在别人无法窃取到的地方,包括加解密运算时所在的地方也要别人无法接触的地方,因为只要能接触到加解密运算的场所那么就能获取到密钥。

要么你保证存放密钥的电脑,不能被黑客入侵,要不你就将密钥存放在所有人都获取不了的地方现在网上银行使用的那个USBKEY就是自带芯片,内置cpu,密钥以及加解密运算都是在USBKEY内部进行。这样任何人都没有办法通过USBKEY获取到密钥,这样才是绝对的安全

 

参考资料

 

http://www.51testing.com/html/12/540.html

 

http://www.cnblogs.com/evlon/articles/360047.html

 

http://book.51cto.com/art/200807/82225.htm