HTTPS协议
在一些网页访问时,需要进行加密,加密一般分为两种,即对称加密和非对称加密。
在对称加密算法中,加密和解密使用的密钥是相同的。在非对称加密算法中,加密使用的密钥和解密使用的密钥是不相同的。一把是公开的公钥,另一把是自己持有的私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。
对称加密算法相对非对称加密算法来说,效率较高
对称加密
对称加密相对来说,在互联网上传输时,收发两者使用同一个密钥进行加密和解密,但如果密钥本身被黑客截获,会非常不安全。
非对称加密
一般来说,非对称加密的私钥放在发送消息的设备处,不会在互联网上传播,保证了私钥的私密性,对应私钥的公钥,可以在互联网上随意传播。为了防止黑客模仿正常用户,获取网站的密钥信息,一般来说除了访问网站,客户端也都有自己的公钥和私钥。客户端给网站发送消息时,采用网站的公钥加密,网站给客户端发送消息时,采用客户端的公钥加密。
数字证书
非对称加密存在的问题是,如何将不对称加密的公钥给对方,一种是放在公网地址一种是建立连接时传给对方,但都存在的问题是,接收方如何家别传输得到的公钥是对的。需要具由权威部门颁发的证书
证书中包含公钥,证书所有者,以及证书的发布机构和有效期。
生成证书需要发起一个证书请求,然后将这个请求发给一个权威机构去认证,这个权威机构称为CA( Certificate Authority)。
证书请求通过命令生成后,将这个请求发给CA,CA会给证书卡一个章,称为签名算法。签名算法只有通过CA的私钥签名之后才行。
签名算法工作流程:一般是对信息做一个Hash计算,得到一个Hash值,这个过程是不可逆的,也就是说无法通过Hash值得出原来的信息内容。在把信息发送出去时,把这个Hash值加密后,作为一个签名和信息一起发出去。
验证证书流程:如果需要验证证书,需要CA的公钥,如果想要确定CA的公钥是对的,CA的公钥也需要更牛的CA给它签名,然后形成CA的证书。要想知道某个CA的证书是否可靠,要看CA的上级证书的公钥,能不能解开这个CA的签名。这样层层上去,直到全球皆知的几个著名大CA,称为root CA,做最后的背书。通过层层授信背书的方式,从而保证了非对称加密模式的正常运转。
Self-Signed Certificate,自己给自己签名。
HTTPS的工作模式
HTTPS总体思路上就是把非对称加密和对称加密结合起来,因为非对称加密在性能上不如对称加密,公钥私钥主要用于传输对称加密的秘钥,而真正的双方大数据量的通信都是通过对称加密进行的。
具体流程:
-
登录网站时,由于是HTTPS,客户端发送Client Hello消息到服务器,以明文传输TLS版本信息、加密套件候选列表、压缩算法候选列表等信息。还有一个随机数,在协商对称密钥的时候使用。
-
网站返回Server Hello消息, 告知客户端,服务器选择使用的协议版本、加密套件、压缩算法等,和一个随机数,用于后续的密钥协商。
-
网站给客户端一个服务器端的证书
-
客户端接收到证书后,会从自己信任的CA仓库中,用CA证书里面的公钥去解密网站的证书。如果成功,则说明网站是可信的。这个过程中可能会不断往上追溯CA、CA的CA、CA的CA的CA,直到一个授信的CA。
-
证书验证完毕之后,网站可信,客户端计算产生随机数字Pre-master,发送Client Key Exchange,用证书中的公钥加密,再发送给服务器,服务器可以通过私钥解密出来。
-
无论客户端还是服务器,都有了三个随机数,分别是自己的,对端的以及上步生成的Pre-Master随机数。通过这三个随机数,可以在客户端和服务器产生相同的对称密钥。
-
生成对称密钥后,客户端发送一个Encrypted Handshake Message,将已商定好的参数等,采用协商密钥进行加密,发送给服务器用于数据与握手验证。
-
同样,服务器也发送Encrypted Handshake Message的消息试试。当双方握手结束之后,即可通过对称密钥进行加密传输。
-
上述过程只包含HTTPS的单向认证,也即客户端验证服务端的证书,是大部分的场景,也可以在更严格安全要求的情况下,启用双向认证,双方互相验证证书。
重放和篡改
对于黑客来说,有了加密和解密,截获的包无法打开,但其可以发送N次。通过Timestamp和Nonce随机数联合起来,做一个不可逆的签名来保证。Nonce随机数保证唯一,或者Timestamp和Nonce合起来保证唯一,请求只接受一次,服务器多次收到相同的Timestamp和Nonce,则视为无效。