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