大家在上网的时候可能会注意到,有的网址在地址栏边上会有一个小锁头,点击会出现“这个连接是安全的”字样,那么这个所谓的“安全”就是指这个网站采用了HTTPS技术以及采用的证书也是经过认证的。
这里我们先不用管这个证书是什么,我们直接看看HTTPS这个东西。简而言之HTTP就是互联网应用层被广泛使用的协议,有了这个协议,再配合其他的协议我们就可以上网冲浪了。但是HTTP协议有个问题,它传输数据是明文的,而且没有身份验证,也就是说任何人只要想就能有办法去偷看你在干什么。这肯定是不行的,万一哪天在网上消费被人拦截了岂不是可能造成财产损失?
所以HTTPS应运而生,HTTPS就是安全的HTTP的意思也就是HTTP加上SSL这层外壳,这里面用到的手段就是:加密,认证加上完整性保护三个。接下来我们一个个拆分开看。
数据传输(加密)
传输数据的话我们第一反应肯定是加密,其实这个很好理解,你不想让别人看出来你的网络请求是什么那就把数据都搞成加密的就好了嘛。
所以现在的问题有两个:
我们应该采用什么加密方式?我们应该怎么让对方知道密钥是什么,然而其他人却不能知道呢?首先对于第一个问题,加密算法目前分为两类:对称加密与非对称加密,对称指的是加密跟解密使用的同一个密钥,非对称加密自然就是指加密解密用的不是同一个,即一对公钥私钥来做。这里我们应该采用对称加密,理由主要有两个:一是速度更快,资源消耗更少;二是非对称加密对数据长度有要求,而且生成对加密数据体积更大。
接下来就是解决第二个问题了,密钥传输问题。
密钥传输(加密)
首先我们第一反应肯定也是把密钥加密传输,这里就不可能使用对称加密了,要不然直接死循环,所以这里我们要用非对称加密。
具体来说就是客户端问服务器要一个公钥,然后客户端使用公钥加密密钥,然后服务端使用私钥解密,这就没有密钥泄漏的问题了。
但是问题又来了,这个公钥如果被拦截泄漏了怎么办?所以这时候认证“证书”就登场了。
公钥传输(认证)
我们不直接传输一串明文公钥A,而是服务器去向权威机构购买申请一个数字证书A,证书A里面就包含着机构信息以及用权威机构的私钥B加密后的公钥A,服务器将这个证书A传给客户端,而客户端内置着几大权威机构的公钥B,用来核对机构信息并解密证书A得到公钥A。这样客户端只需要存储几个机构的公钥就可以了,用机构的权威性背书。
看起来好像是没啥问题了,但是如果这个时候,拦截你请求的那个人也向权威机构申请了一张证书C的话怎么办?他依然可以拦截掉证书A替换成证书C,因为它的证书也是合法的,所以拦截依然可以成功。或者这个人直接修改了证书,把公钥替换掉了,也是一样的效果。
所以我们不只是需要加密,还要保证数据的完整性,没有被篡改过。
证书传输(完整性)
证书传输中,会有一个证书签名,客户端在解密之后得到公钥与签名,同时会对证书进行一次哈希算法摘要得到签名,将两个签名进行比对就可以看出来证书有没有中途被修改过。
如果这个人强行替换了你的证书内容,那么他会有一个问题,就是他并不知道机构的私钥,所以无法将签名加密,强行签名并加密的话在客户端那里就解不出来。
然后证书中也会记载服务器的域名信息,如果收到的证书域名跟自己要访问的域名不一致,依然可以视为验证失败,直接拒绝访问。
这些都完备了就可以认为一个安全的HTTP连接就建立了,客户端与服务器就可以愉快地交流了。
接下来第二篇我想用实例去尝试进行HTTPS的实践,如有问题欢迎大家指正,谢谢。
版权声明:本文转载于今日头条,版权归作者所有,如果侵权,请联系本站编辑删除