关闭

通俗解说SSL

标签: ssl加密算法server解密网络协议
994人阅读 评论(0) 收藏 举报
分类:

要理解ssl先要知道一些加密算法的常识.
    加密算法很容易理解啦,就是把明文变成人家看不懂的东西,然后送给自己想要的送到的地方,接收方用配套的解密算法又把密文解开成明文,这样就不怕在路世上如果密文给人家截获而泄密。
    加密算法有俩大类,第一种是不基于KEY的,举个简单的例子,我要加密"fordesign"这么一串字符,就把每个字符都变成它的后一个字符,那么就是"gpseftjhm"了,这样的东西人家当然看不明白,接收方用相反的方法就可以得到原文。当然这只是个例子,现在应该没人用这么搞笑的加密算法了吧。
    不基于KEY的加密算法好象一直用到了计算机出现。我记得古中国军事机密都是用这种方式加密的。打战的时候好象军队那些电报员也要带着密码本,也应该是用这种方式加密的。这种算法的安全性以保持算法的保密为前提。
    这种加密算法的缺点太明显了,就是一旦你的加密算法给人家知道,就肯定挂。日本中途岛惨败好象就是密码给老米破了。设计一种算法是很麻烦的,一旦给人破了就没用了,这也忑浪费。
    我们现在使用的加密算法一般是基于key的,也就是说在加密过程中需要一个key,用这个key来对明文进行加密。这样的算法即使一次被破,下次改个key,还可以继续用。key是一个什么东西呢?随便你,可以是一个随机产生的数字,或者一个单词,啥都行,只要你用的算法认为你选来做key的那玩意合法就行。
    这样的算法最重要的是:其安全性取决于key,一般来说取决于key的长度。也就是说应该保证人家在知道这个算法而不知道key的情况下,破解也相当困难。其实现在常用的基于KEY的加密算法在网络上都可以找到,很多革命同志(都是老外)都在想办法破解基于key的加密算法又包括俩类:对称加密和不对称加密。对称加密指的是双方使用完全相同的key, 最常见的是DES. DES3, RC4等。对称加密算法的原理很容易理解,通信一方用KEK加密明文,另一方收到之后用同样的KEY来解密就可以得到明文。
    不对称加密指双方用不同的KEY加密和解密明文,通信双方都要有自己的公共密钥和私有密钥。 举个例子比较容易理解, 我们们假设通信双方分别是A, B.
A, 拥有 KEY_A1, KEY_A2, 其中KEY_A1是A的私有密钥,KEY_A2是A的公共密钥。
    B, 拥有KEY_B1, KEY_B2, 其中KEY_B1是B的私有密钥,KEY_B2是B的公共密钥。
    公共密钥和私有密钥的特点是,经过其中任何一把加密过的明文,只能用另外一把才能够解开。也就是说经过KEY_A1加密过的明文,只有KEY_A2才能够解密,反之亦然。
通信过程如下:
   
     A-------->KEY_A2------------>B
   
     A<--------KEY_B2<------------B
   
    这个过程叫做公共密钥交换,老外管这叫key exchange.
    之后A和B就分别用对方的公共密钥加密,用自己的私有密钥解密。
    一般公共密钥是要发布出去的,然后你通过自己的私有密钥加密明文,人家用你的公共密钥解密,如果能解开,那么说明你是加密人,这就是SSL使用的验证机制。
    常用的不对称加密一般有RSA, DSA, DH等。我们一般使用RSA.
    数字签名也是不对称加密算法的一个重要应用,理解它对于理解SSL很重要的,放在这里一起介绍一下。
    签名是什么大家都很熟悉吧?证明该东西是你写的,是你发布的,你就用签名搞定。看看那些重要文件都要头头签名。数字签名就是数字化的签名了。记得公用密钥和私有密钥的特征吗?只有你一个人有你自己的私有密钥。而你的公用密钥是其他人都知道的 了。那么你在写完一封邮件之后,用自己的私有密钥加密自己的名字,接收人用你的公共密钥解开一看,哦,是你发的。这就是你的数字签名过程了。
    上面的解释是很简化的了,其实数字签名比这个复杂多了,但我们没有了解的必要,知道数字签名是这么一回事就可以了。
    还有一种我们需要知道的加密算法,其实我不觉得那是加密算法 ,应该叫哈希算法,英文是message digest, 是用来把任何长度的一串明文以一定规则变成固定长度的一串字符串。它在SSL中的作用也很重要,以后会慢慢提及的。一般使用的是MD5, SHA. base64不是加密算法,但也是SSL经常使用的一种算法,它是编码方式,用来把asc码 和二进制码转来转去的。
    具体的加密解密过程我们不需要了解,因为SSL根本不关心。但了解加密算法的一些基本原理是必要的,否则很难理解SSL。
    对加密算法的细节有兴趣的同志,可以去网络上找这些加密算法的原理的文章和实现的程序来研究,不过先学数论吧。不懂数论看那玩意还是一头雾水。

 

SSL(Secure Socket Layer)是netscape公司提出的主要用于web的安全通信标准,分为2.0版和3.0版.TLS(Transport Layer Security)是IETF的TLS工作组在SSL3.0基础之上提出的安全通信标准,目前版本是1.0,即RFC2246.SSL/TLS提供的安全机制可以保证应用层数据在互联网络传输不被监听,伪造和窜改.
    一般情况下的网络协议应用中,数据在机器中经过简单的由上到下的几次包装,就进入网络,如果这些包被截获的话,那么可以很容易的根据网络协议得到里面的数据.由网络监听工具可以很容易的做到这一点。
    SSL就是为了加密这些数据而产生的协议,可以这么理解,它是位与应用层和TCP/IP之间的一层,数据经过它流出的时候被加密,再往TCP/IP送,而数据从TCP/IP流入之后先进入它这一层被解密,同时它也能够验证网络连接俩端的身份。
    它的主要功能就是俩个:
    一:加密解密在网络中传输的数据包, 同时保护这些数据不被修改, 和伪造。
    二:验证网络对话中双方的身份
    SSL协议包含俩个子协议,一个是包协议,一个是握手协议。包协议是说明SSL的数据包应该如何封装的。握手协议则是说明通信双方如何协商共同决定使用什么算法以及算法使用的key。 很明显包协议位于握手协议更下一层。我们暂时对包协议的内容没有兴趣。
    SSL握手过程说简单点就是:通信双方通过不对称加密算法来协商好一个对称加密算法以及使用的key, 然后用这个算法加密以后所有的数据完成应用层协议的数据交换。   
     握手一般都是由client发起的,SSL也不例外。
    1 client送给server它自己本身使用的ssl的version(ssl一共有三个version),加密算法的一些配置,和一些随机产生的数据,以及其他在SSL协议中需要用到的信息。
    2 server送给client它自己的SSL的version, 加密算法的配置,随机产生的数据,还会用自己的私有密钥加密SERVER-HELLO信息。Server还同时把自己的证书文件给送过去。同时有个可选的项目,就是server可以要求需要客户的certificate。
    3 client就用server送过来的certificate来验证server的身份。如果server身份验证没通过,本次通信结束。通过证书验证之后,得到server的公共密钥,解开server送来的被其用私有密钥加密过的SERVER-HELLO信息,看看对头与否。如果不对,说明对方只有该server的公共密钥而没有私有密钥,必是假的。通信告吹。
    4 client使用到目前为止所有产生了的随机数据(shared secret), client产生本次握
    手中的premaster secret(这个步骤是有可能有server的参与的,由他们使用的加密算法决定),并且把这个用server的公共密钥加密,送回给server.如果server要求需要验 证client,那么client也需要自己把自己的证书送过去,同时送一些自己签过名的数据过去。
    SSL协议有俩种技术来产生shared secret(真不好意思,又是一个很难意译的词组),一种是RSA, 一种是EDH.
    RSA就是我们上一章说过的一种不对称加密算法。首先server把自己的RSA公共密钥送给client, client于是用这个key加密一个随机产生的值(这个随机产生的值就是shared secret), 再把结果送给server.
    EDH也是一种不对称加密算法, 但它与RSA不同的是,它好象没有自己固定的公共密 钥和私有密钥,都是在程序跑起来的时候产生的,用完就K掉。其他的步骤俩者就差不多了。
    RSA, DSA, DH三种不对称加密算法的区别也就在这里。RSA的密钥固定,后俩个需要一个参数来临时生成key.DH甚至要求双方使用同样的参数,这个参数要事先指定。如果SSL库没有load进这个参数,DH算法就没办法用。DSA没研究过。
    5 Server验证完client的身份之后,然后用自己的私有密钥解密得到premaster secret然后双方利用这个premaster secret来共同协商,得到master secret.
    6 双方用master一起产生真正的session key, 着就是他们在剩下的过程中的对称加密的key了。这个key还可以用来验证数据完整性。双方再交换结束信息。握手结束。
    接下来双方就可以用协商好的算法和key来用对称加密算法继续下面的过程了。
    很简单吧?其实要复杂一些的,我简化了很多来说。
    不过还是有个问题,喜欢捣蛋的人虽然看不懂他们在交流些什么,但篡改总可以吧?记得我们在加密算法里面介绍过的哈希算法吗?就是为了对付这种捣蛋者的。在每次送信息的时候,附带把整条信息的哈希值也送过去,接收方收到信息的时候,也把收到的内容哈希一把,然后和对方送来的哈希值对比一下,看看是否正确。捣蛋者如果乱改通信内容,哈希出来的值是不同的,那么就很容易被发现了。
    但这样子,捣蛋者至少可以学舌。他可以把之前监听到的内容重复发给某一方,而这些内容肯定是正确的,无法验证出有问题的。哎,SSL是怎么对付这种人的我还没看出来。有篇文章说:多放点随机数在信息里可以对付,我也没去研究这句话是什么意思。


 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:346099次
    • 积分:4552
    • 等级:
    • 排名:第7844名
    • 原创:112篇
    • 转载:81篇
    • 译文:2篇
    • 评论:62条
    文章分类
    最新评论
    javascript