HTTPS与加密

1、http安全问题:

泄密,个人隐私、账户密码等信息可能会被盗取。
篡改,收到的数据可能被第三方修改过,或被植入广告等。
假冒,访问的站点非目标服务器站点。如域名欺骗、域名劫持、钓鱼网站等。

为了保护数据隐私,让数据不再“裸奔”。对需要传输的数据进行加密处理就很有必要了。目前而言,加密算法可以分两大类,一类是对称加密算法,还有一类是非对称加密算法。

 对称加密

 对称加密算法的加密和解密都是用同一个密钥。客户端需要将秘钥和数据传输给服务端,所以存在密钥泄露的问题!如银行采用的是离线加密狗,保证密钥安全。

非对称加密

非对称加密算法需要一组密钥对,分别是公钥和私钥,这两个密钥是成对出现的。公钥加密的内容需要用私钥解密,私钥加密的内容需要用公钥解密!私钥由服务器自己保存,公钥发送给客户端。
客户端拿到公钥后就可以对请求进行加密后发送给服务端了,这时候就算被截获,如果没有私钥也无法解密发送的内容,这样确保了客户端发送到服务端数据的“安全”!

问题:由于公钥也需要通过网络发送给客户端,同样能被截获并替换来攻击我们的服务器并且非对称加密的效率很低。 

为了防止公钥被假冒,数字证书(digital certificate )便诞生了。

数字证书

当服务器需要告诉浏览器公钥时,并不是简单地返回公钥,而是响应包含公钥信息在内的数字证书。

证书主要包含以下内容:

证书拥有者的公钥(这里对应服务器的公钥)
颁发机构信息(如由DigiCert Inc颁发的)
签名中的hash摘要算法(如SHA)
以上等内容的摘要签名(通过【颁发机构的私钥】加密的结果)即数字证书,然后发给客户端。

浏览器通过【颁发机构的公钥】对数字证书解密验签,验签通过即说明证书的真实性,可以放心取证书拥有者的公钥了。(常用CA机构的公钥都已经植入到浏览器里面)

验签步骤:

客户端拿到数字证书后,先通过操作系统或者浏览器内置信任的CA机构找到对应CA机构的公钥对数字证书S进行解密得到文件哈希值H,然后采用同样的摘要算法计算内容的摘要,如果自己计算的摘要与服务器发来的摘要一致,则证书是没有被篡改过的!这样就防止了篡改!第三方拿不到CA机构的私钥,也就无法对证书进行加密,如果是第三方伪造的证书自然也在客户端无法解密,这就防止了伪造!所以数字签名就是通过这种机制来保证数字证书不被篡改和伪造。

以上保证了 [浏览器⇒服务器] 是加密的,然而 [服务器⇒浏览器] 却没有;另外一个是性能问题,如果所有数据都使用非对称加密的话,会消耗较多的服务器资源,通信速度也会受到较大影响。
HTTPS巧妙地结合了非对称加密和对称加密,在保证双方通信安全的前提下,尽量提升性能。

HTTPS建立安全连接的基本流程

SSL:安全套接字层
TLS:传输层安全协议
X.509:数字证书的格式标准,https依赖的SSL证书使用的就是使用的X.509格式。
OpenSSL:工具包,秘钥证书管理、对称加密和非对称加密。

HTTPS=HTTP+SSL,在HTTP层和TCP之间加了一个SSL/TLS层,HTTPS(SSL/TLS)期望建立安全连接后,通信均使用【对称加密】。

建立安全连接的任务就是让浏览器-服务器协商出本次连接使用的【对称加密的算法和密钥】;协商过程中会使用到【非对称加密】和数字证书

客户端通过与服务端四次握手,确定对称加密算法和拿到服务端的公钥,客户端随机生成对称加密的秘钥。客户端通过公钥对对称加密的秘钥进行加密,然后将公钥加密的秘钥传输给服务端,服务端通过私钥解密拿到对称加密的秘钥。
然后通过对称秘钥在两边传输数据。

为什么有HTTPS了,往往还要在应用层进行一次加密/签名?
确认发送端的身份。值得注意的是,HTTPS只是保证了传输过程中防止被窥视和被假冒篡改信息,任何人都可以请求建立安全连接(SSL/TCL握手),发送内容。如果想要限制只接受处理某些请求的话,除开IP白名单外,在应用层再加一个签名验证就是个不错的选择。
安全性。从客户端到真正处理的应用服务器,途中可能会经过很多中转(代理)服务器,对于极其敏感的数据,应用方并不希望中转服务器有看到明文的机会。另外中转协议并不一定全部都是HTTPS,像内网中转往往就是使用HTTP的(SSL卸载)。

参考:https://www.jianshu.com/p/b8b5459e86e9
 
原文地址:https://www.cnblogs.com/spdboke/p/14670490.html