写给前端工程师的理论基础(2)--HTTPS协议与密码学

来源:互联网 发布:windows域 编辑:程序博客网 时间:2024/06/08 08:05

    上一回写的是Session与Cookie方面的内容,这一次,写一下HTTPS协议和有关密码学方面的内容。
HTTP协议我们都已经知道了,这一一种基于TCP协议的,非持久连接的,传输文本流(以文本为内容,非二进制的比特流)的协议。
    这种协议的特点上面已经说得差不多了,HTTP协议里面又很多的信息,包括表明身份的cookie,包括从哪来的referer,包括服务器版本号和服务器时间的服务器信息,包括编码和地区/语言等信息。
    这些信息都是一些表明具体连接环境的附加信息,真正的网页内容在这些信息后面被编码(例如url编码,POST文件这种二进制信息)后进行传送。
    那么HTTPS协议是什么呢?由于传统的HTTP协议是一种明文的数据,这种数据很容易被截获,也很容易伪造。
    在信息安全中,这种截获是一种被动攻击,截获的数据中可能包含用户的敏感信息;伪造,是一种主动攻击,攻击者可以仿造获取的原数据包的内容,然后修改其中的某些关键信息,达到伪造数据的目的。
    例如,因为cookie尚且在有效的生命周期内,改一改关键的上传信息,可以发一些广告了之类的东西,也都是可以的。
    而这样的一种明文环境,如果在正常用户使用的时候,也没什么,无非就是信息泄露了而已,而如果用在电子商务这种关键的场景,可能就会出现一些问题。
    后来,为了针对这种明文的环境,设计出了一种HTTPS协议。
    HTTPS和HTTP协议相比,无非就是多了一个加密机制,让截获者无法获取其中的内容,同时,这种协议对服务器也是一种验证,用户也可以根据证书来判断服务器是否是可靠的。
下面,我们来简单说说这种HTTPS协议:
    HTTPS协议,是HTTP协议在SSL加密准则下的加密产物。SSL加密不是具体的一种算法,SSL是一种协议,这种协议介于HTTP协议和TCP协议之间。具体的加密算法往往是RSA算法(取决于证书),当然,在某些场景,你也可以使用其他的例如椭圆曲线等等这类的算法,不过,对于大多数情景,使用的都是RSA算法,我们来用最通俗易懂的方式,说说RSA算法。
    RSA算法,是一种非对称加密算法,所谓非对称加密算法,是针对传统的对称加密算法来说的。
例如,我的开机密码是123456,我只能通过123456来解密,其他的当然不可以。那么,也就是说,加密和解密的秘钥(你可以理解为密码)是相同的,类似的情景还可以是一把钥匙开一把锁。
    设想这样的场景,对于这种加密方式,如果在网站数据加密的时候,怎么应用呢?
    网站对内容加密了,然后我想看到具体的内容,我必须要知道密码呀,那网站告诉我密码是123456了,那对于别人呢,自然也告诉他们密码。那既然所有人都知道密码了,那它还叫密码吗?
    解决的方案似乎是大家的密码都不同,只有网站自己知道谁的密码是什么,但是,这种情况,密码量也太大了点儿吧。
    那怎么办呢?设想这样的场景:
    网站的加密密码只有他自己知道,我们称之为私钥;当用户浏览网页时,浏览器会从网站那里,得到网站告诉他的解密秘钥,这个秘钥由于是公开给客户的,我们称之为公钥。
    也就是说,公钥是大家都可以知道的,私钥只有他自己知道,注意,这里我们说,如果用私钥加密,私钥自己是解不开密码的,必须用公钥才能解开,反过来,如果用公钥加密了,自己用公钥也没法解开,必须是用私钥才能解开,这样,通俗点儿说,就是自己加密了,自己没法解开,必须给别人解开,这样,一个既能加密又能解密的秘钥就被分成了两部分,这两部分是相辅相成的,组成了一个密钥对。

两个情景:
1.验证:私钥加密,公钥解密
2.加密:公钥加密,私钥解密

    你可以设想,公钥是大家都知道的,以加密为例,你给大家发锁头,只有你自己才有钥匙,这个内容自然只有你自己知道了。
    那么验证来讲,用私钥加密了,然后大家都能解密,如果确实能解开密码,则可以确认这就是具有私钥的人加的密,不然我的钥匙打不开这把锁,这样确认了身份的过程,就是验证了。

    SSL协议就是这样一种公私分离的方式,在具体的情况下,客户会用服务器给的公钥随机生成一个主密钥,服务器反过来测试一下客户是不是可靠的,如果可靠的,就会用这个随机产生的主密钥加密数据进行通信了。