What
HTTPS在传统的HTTP和TCP之间加了一层用于加密解密的SSL/TLS层
(安全套接层Secure Sockets Layer/安全传输层Transport Layer Security)层。使用HTTPS必须要有一套自己的数字证书(包含公钥和私钥)。
Why
HTTP的问题
- 不加密,通信是明文,可能被窃听
- 无法证明报文的完整性,可能被篡改
- 没验证通信方的身份,可能遭遇中间人伪装
HTTPS解决的问题
- 信息加密传输:第三方无法窃听;
- 校验机制:一旦被篡改,通信双方会立刻发现;
- 身份证书:防止身份被冒充。
How
如何加密
哈希加密
哈希算法加密是通过哈希算法对数据加密,加密后的结果不可逆,即加密后不能再解密。 特点: 不可逆、算法公开、相同数据加密结果一致。 作用: 信息摘要,信息“指纹”,用来做数据识别的。如:用户密码加密、文件校验、数字签名、鉴权协议。
对称加密
加密和解密同用一个密钥。没有密钥就无法对密码解密,反过来说,任何人只要持有密钥就能解密了。对称加密有很多种算法,常用的有AES, DES。由于它效率很高,所以被广泛使用在很多加密协议的核心当中。
encrypt(明文,秘钥) = 密文
decrypt(密文,秘钥) = 明文
优点: 相对于非对称加密,加解密效率高得多,加密速度块。 缺点: 对于秘钥的管理和分发上比较困难,秘钥管理负担重。
非对称加密
指的是加、解密使用不同的密钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥只能由一方安全保管,不能外泄,而公钥则可任意发布给需要的人。 非对称RSA有2种用法:
- 加解密 公钥加密,私钥解密是普通的方式
- 数字签名 私钥签名(加密),公钥验证(解密)是数字签名,防止中间人冒充
encrypt(明文,公钥) = 密文
decrypt(密文,私钥) = 明文
sign(明文,私钥) = 密文
verify(密文,公钥) = 明文
优点: 安全性高,私钥自己保存,不需要传输。 缺点: 加解密消耗高,速度慢。
HTTPS采用了对称加密+非对称加密的方案。具体做法如下:
但是依然解决不了中间人的攻击,如下图:
因此需要保证数据完整性引入数字签名
如何保证数据完整性-数字签名
网络传输过程中需要经过很多中间节点,虽然数据无法被解密,但可能被篡改,那如何校验数据的完整性呢?—-校验数字签名。
数字签名是通过HASH算法和RSA加密来实现的。 我们将明文数据加上通过RSA加密的数据HASH值一起传输给对方,对方可以解密拿出HASH值来进行验证。这个通过RSA加密HASH值数据,我们称之为数字签名。
数字签名有两种功效:
- 能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。
- 数字签名能确定消息的完整性,证明数据是否未被篡改过。
数字签名如何生成:
将一段文本先用HASH算法生成消息摘要,然后用发送者的私钥RSA加密生成数字签名,与原文一起传送给接收者。接下来就是接收者校验数字签名的流程了。
校验数字签名流程:
接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH算法对收到的原文产生一个摘要信息,与上一步得到的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。
上面可行的前提是需要事先拿到可信的公钥,因此引入数字证书
如何校验身份-数字证书
数字证书就是Server将公钥和公司信息提交给证书颁发机构(Certificate Authority,简称CA),CA将公钥和其他信息数字签名后生成证书, Client也会内置所有受信CA的证书。
至此HTTPS的流程如下:
- 客户端请求服务器获取
证书公钥
- 客户端(SSL/TLS)解析证书,判断真实性
- 生成
密钥
- 用
公钥
加密密钥
- 客户端将
密钥
发送给服务器 - 服务端用
私钥
解密得到密钥
将信息和密钥混合在一起
进行对称加密- 将加密的内容发送给客户端
- 客户端用
密钥
解密信息
附:
- HTTPS默认使用443端口,而HTTP默认使用80端口。
- TLS就是从SSL发展而来的,只是SSL发展到3.0版本后改成了TLS
- 第一次请求中TLS握手的代价很大
- 后续的请求会共用第一次请求的协商结果