> ### `HTTPS` `ssl`
* `client`和`server`双发传递数据,对数据采用对称加密算法加密(如`AES`,对称加密双方采用统一的密钥`key`)
![](https://i.loli.net/2019/03/11/5c861b5a85bea.png)
* 关键在于双方如何确定这个统一的公钥所以采用非对称加密算法(如`RSA` `ECC`,密钥和私钥)对`AES`的密钥进行加密传输,为了防止中间人攻击,采用第三方机构`CA`。
* 服务端首先把自己的公钥`s_key_pub`发给证书颁发机构,向证书颁发机构申请证书。证书颁发机构自己也有一对公钥私钥`ca_key_pub` `ca_key`。机构利用自己的私钥`ca_key`来加密`s_key_pub`,并且通过服务端网址等信息生成一个证书签名,证书签名同样经过机构的私钥加密。证书制作完成后,机构把证书发送给了服务端
![](https://i.loli.net/2019/03/11/5c8621ca3f91a.png)
* `client`向`server`发送请求时,`server`把自己的证书发送给`client`,`client`收到证书后,对证书验证真伪。各大浏览器和操作系统已经维护了所有权威证书机构的名称和公钥。所以`client`只需要知道是哪个机构颁布的证书,就可以从本地找到对应的机构公钥,用机构公钥解密出证书签名并验证与请求网址是否一致(此处client验证证书签名存疑)。 一致则表明证书可靠,再解密证书,得到`server`的公钥`s_key_pub`,然后`client`生成自己的对称加密算法`AES`的密钥`c_key`,并用刚解密到的`server`的公钥`s_key_pub`对其进行加密然后发送给`server`
![](https://i.loli.net/2019/03/11/5c86288b97328.png)
* `server`收到之后用自己的密钥`s_key`进行解密,得到了`client`的对称加密算法的`c_key`,然后`server`与`client`就通过`c_key`加密数据进行传输。
<br/>
> ### 加密算法
对称加密算法的加密与解密 密钥相同,非对称加密算法的加密密钥与解密 密钥不同,此外,还有一类 不需要密钥 的 散列算法。
* 对称加密: `DES` `3DES` `AES
`
* 非对称加密:`RSA` `DSA
` `ECC`
* `RSA`两个大 素数 相乘十分容易,但想要对其乘积进行 因式分解 却极其困难,因此可以将 乘积 公开作为 加密密钥
* 散列算法:SHA-1、MD5
<br/>
<br/>
***
* 参考 [漫画:什么是 HTTPS 协议?](https://zhuanlan.zhihu.com/p/57142784)
- asD
- Java
- Java基础
- Java编译器
- 反射
- collection
- IO
- JDK
- HashMap
- ConcurrentHashMap
- LinkedHashMap
- TreeMap
- 阻塞队列
- java语法
- String.format()
- JVM
- JVM内存、对象、类
- JVM GC
- JVM监控
- 多线程
- 基础概念
- volatile
- synchronized
- wait_notify
- join
- lock
- ThreadLocal
- AQS
- 线程池
- Spring
- IOC
- 特性介绍
- getBean()
- creatBean()
- createBeanInstance()
- populateBean()
- AOP
- 基本概念
- Spring处理请求的过程
- 注解
- 微服务
- 服务注册与发现
- etcd
- zk
- 大数据
- Java_spark
- 基础知识
- Thrift
- hdfs
- 计算机网络
- OSI七层模型
- HTTP
- SSL
- 数据库
- Redis
- mysql
- mybatis
- sql
- 容器
- docker
- k8s
- nginx
- tomcat
- 数据结构/算法
- 排序算法
- 快排
- 插入排序
- 归并排序
- 堆排序
- 计算时间复杂度
- leetcode
- LRU缓存
- B/B+ 树
- 跳跃表
- 设计模式
- 单例模式
- 装饰者模式
- 工厂模式
- 运维
- git
- 前端
- thymeleaf
- 其他
- 代码规范
- work_project
- Interview