在谍战剧里,情报如何不被截获,不被破译,几乎是全剧的主线剧情之一。某电台通过某个频道发送一串数字,然后潜伏人员一般会拿密码本,译码后得到原文。这个密码本就是对称加密中的密钥,发送方和接收方按照密码本分别进行加密和解密工作。如果密码本被敌人截获,则后果极为严重,通常能够做的也就是更换密码。
早起计算机都是单机状态,保证数据的安全依赖于加密算法的可靠性。如果加密算法可靠,即使存储介质被窃取,对方想通过密文恢复明文也是十分困难的。DES加密算法是一种对称加密算法,它几乎让破解者无法找到规律,即使暴力破解也很难还原明文。
发展到网络时代,整个网络中最频繁、最重要的操作就是网络中各终端之间的通信。在传输层本身不会做任何的加密,这就好比一辆满载黄金的马车在驿道奔驰,很难不让网络上的黑客视而不见。如何保证通信之间数据传输的安全性,成为了计算机网络时代最重要的安全课题。说到对网络传输数据的加密,必须要先说安全套接字层(Secure Socket Layer,SSL)。SSL协议工作于传输层与应用层之间,为应用提供数据的加密传输。而HTTPS的全称是HTTP over SSL,简单的理解就是在之前的HTTP传输上增加了SSL协议的加密能力。
我们可以通过对称加密算法对数据进行加密,比如DES,即一个主站与用户之间可以使用相同的密钥对传输内容进行加解密。是否可以认为这样就完全没有风险呢?答案显然是否定的。因为密钥几乎没有什么保密性可言,如果与每一个用户之间都约定一个独立的密钥,如何把密钥传输给对方,又是一个安全难题。在互联网上,IP报文好比管道上运送粮草、黄金、物资的载体,很容易被人盯上,密钥本身如果被盗,那么再复杂的密钥也是摆设。自然的想法是在密钥之上再加密,这就是递归的穷举问题了。
有没有一种方式,使保温被劫取之后,黑客依然无计可施?一种全新的算法RSA出现了。它把密码革命性地分成公钥和私钥,由于两个密钥并不相同,所以称为非对称加密。密钥是用来对公钥加密的信息进行解密的,是需要严格保密的。公钥是对信息进行加密,任何人都可以知道,包括黑客。
非对称加密的安全性是基于大质数分解的困难性,在非对称讲的加密中公钥和私钥是一对大质数函数。计算两个大质数的乘积是简单的,但是这个过程的逆运算(即将这个乘积分解为两个质数)是非常困难的。而在RSA的算法中,从一个公钥和秘闻中解密出明文的难度等同于分解两个大质数的难度。因此在实际传输中,可以把公钥发给对方。一方发送信息时,使用另一方的公钥进行加密生成密文。收到密文的以方再用私钥解密,这样一来,传输就相对安全了。
但是非对称加密并不是完美的,它有一个很明显的缺点是加密和解密耗时长,只适合对少量数据进行处理。回到前面的例子中,我们担心对称加密中的密钥安全问题,那么将密钥的传输使用非对称加密就完美地解决了这个问题。实际上,HTTPS也正是通过这样一种方式来建立安全地SSL连接的。按照上述逻辑,用户甲与用户乙进行非对称加密传输的过程如下:
(1)甲告诉乙,使用RSA算法进行加密。乙说,好的。
(2)甲和乙分别根据RSA生成一对密钥,互相发送公钥。
(3)甲使用乙的公钥给乙加密报文信息。
(4)乙收到信息,并用自己的密钥进行加密。
(5)乙使用同样的方式给甲发送信息,甲使用相同的方式进行解密。
这个过程,看起来似乎无懈可击,但是在TCP/IP里,端到端的通信,路途遥远,夜长梦多。在(2)中,如果甲的送信使者中途被强盗截住,在严刑拷打之下,强盗知道使者是去送公钥的,虽然没有办法破解甲的加密信息,但是可以把这个使者关起来,自己生成一对密钥,然后冒充甲的使者到乙家,把自己的公钥给乙。乙信了,把银行卡密码、存款金额统统告诉了中间的强盗。
所以,在解决了加密危机之后又产生了信任危机。如何解决信任问题呢?如果有一个具有公信力的组织来证明身份,这个问题就得到了解决。CA(Certificate Authority)就是办法HTTPS证书的组织。HTTPS是当前网站的主流文本传输协议,在基于HTTPS进行连接时,就需要数字证书。
访问一个HTTPS的网站的大致流程如下:
(1)浏览器向服务器发送请求,请求中包括浏览器支持的协议,并附带一个随机数。
(2)服务器收到请求后,选择某种非对称加密算法, 把数字证书签名公钥、身份信息发送给浏览器,同时也附带一个随机数。
(3)浏览器收到后,验证证书的真实性,用服务器的公钥发送握手信息给服务器。
(4)服务器解密后,使用之前的随机数计算出一个对称加密的密钥,以此作为加密信息并发送。
(5)后续所有的信息发送都是以对称加密方法进行的。
我们注意到在证书的信息中出现了传输层安全协议(Transport Layer Security,TLS)的概念。这里先解释TLS和SSL的区别。TLS可以理解成SSL协议3.0版本的升级,所以TLS的1.0版本也被标识为SSL3.1版本。但对于打的协议栈而言,SSL和TLS并没有太大的区别,因此在Wireshark里,分层依然用的是安全套接字层(SSL)标识。
在整个HTTPS的传输过程中,主要分为两部分:首先是HTTPS的握手,然后是数据的传输。前者是建立一个HTTPS的通道,并确定连接使用的加密套件及数据传输使用的密钥。而后者主要使用密钥对数据加密并传输。
参考书籍:
《码出高效》