Golang(十)TLS 相关知识(一)基本概念原理
0. 前言
- 最近参与一个基于 BitTorrent 协议的 Docker 镜像分发加速插件的开发,主要参与补充 https 协议
- 学习了 TLS 相关知识,下面对之前的学习做一下简单总结
- 参考文献:TLS完全指南系列文章
1. 基本原理
- TLS 依赖两种加密技术:
- 对称加密(symmetric encryption)
- 非对称加密(asymmetric encryption)
1.1 对称加密
- 加密方和解密方共享同一个秘钥 K:
加密:C = E(M, K)
解密:M = D(C, K)
- 攻击者且听到 K 后就可以作为一个中间人伪装成任意一个对象,实现中间人攻击
1.2 非对称加密
- 非对称加密利用成对的两个秘钥:K1 和 K2,加密者使用一个加密,解密者可以利用另一个解密:
加密:C = E(M, K1)
解密:M = D(C, K2)
- 解密者生成一对秘钥,私钥保存,公钥公开
- 但是中间人可以截获公钥,然后自己生成一对秘钥,把自己的公钥发送给加密者
- 用自己的私钥解密加密者的信息,然后用解密者的公钥加密发送给解密者
- 或者中间人收到解密者公钥加密的消息后,对消息破坏篡改,再发送给解密者
- 导致解密者无法正确解析密文
1.3 数字签名
- 光靠非对称加密很难确定信息发送方身份,因此发明了数字签名
- 根据数字签名,接收方接收到信息之后,可以判断信息是否被破坏过,如果没有被破坏,就可以正确的解码。如果被破坏,就直接丢弃
- 数字签名可以保证对信息的任何篡改都可以被发现,从而保证信息传输过程中的完整性
- 数字签名是实现的关键技术就是哈希技术
- 加密者先对将要传输的信息进行哈希,得到一串独一无二的信息摘要
- 哈希函数往往是不可逆的,无法根据哈希后的内容推断原文;同时,不同的原文,会造成不同的哈希结果,并且结果的差异是巨大甚至毫无规律的
- 对原文进行再细微的修改,得到的哈希后的内容都会与未经修改的原文的哈希内容大相径庭,保证消息内容不被篡改
- 然后,加密者将信息摘要,用自己的私钥进行加密
- 这样就保证只有加密者的公钥才能对信息摘要进行正确的解码,进而保证信息摘要一定是来自加密者
- 加密后的信息摘要实际就是数字签名的内容
- 最后,加密者再将数字签名附加到原文信息的后面,使用解密者公钥加密后发送给解密者
- 解密者接收到信息之后,首先使用自己的私钥解密报文,分别获得原文和数字签名
- 利用加密者公钥对数字签名进行解密,得到信息摘要,如果成功解码,就说明数字签名是来自加密者
- 然后,解密者将信息原文进行哈希得到自己的信息摘要,与解码数字签名得到的信息摘要进行对比,如果相同,就说明原文信息完整,没有被篡改,反之,则确认信息被破坏了
- 目前为止,利用公钥和私钥以及数字签名,可以保证信息传输过程中的私密性和完整性
- 但还存在一个问题:就是公钥分发的问题,上述中间人劫持公钥的问题并没有解决
- 这个问题就需要数字证书和 CA 来解决了
1.4 数字证书和 CA
- 每个加密者或者接受者都有自己的私钥和公钥,如何判断对方的公钥是真实代表对方的是一个问题
- 实际我们会引入一个第三方机构,每个人都找这个真实可信的独立的第三方,请求真伪鉴别服务
- 第三方机构就是 CA(Certification Authorith,证书颁发机构)会给解密者创建一个数字证书
- “用户首先产生自己的密钥对,并将公钥及部分个人身份信息传送给认证中心
- 认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来
- 然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息”
- 公钥和身份信息(域名或者IP)合起来就是 CSR(certificate signing request,身份证申请)
- 实际过程可以看做 CA 利用自己的私钥对 CSR 加密,作为数字签名
- 然后 CSR 连同 CA 的数字签名构成数字证书,也称为 CRT(CA signed certificate)
- 在之后的发送中加密者将数字证书附在数字签名后
- 接收者收到后用 CA 的公钥解密获得,加密者的身份和公钥
- 攻击者不能通过 CA 的验证,无法获取证书,解密者接受后判断数字证书包含的身份信息不是加密者,因此会拒绝
- 但是如果选择信任了错误的 CA,也会被攻击,通常浏览器中会内置靠谱 CA 的身份证(公钥)
1.4 信任链、根身份证和自签名
- CA 也分为不同级别,需要逐级验证
- 比如 CA1 不被大家信任,于是可以将身份信息和公钥发送给受信任的 CA2,获得自己的数字证书
- CA1 在给其他人签署数字证书时,会在后面附上自己的数字证书
- 这样接受者首先利用 CA2 的公钥验证 CA1,获得 CA1 的公钥后再验证发送者
- 这样逐级签署数字证书,形成了一条信任链
- 最终的根节点就是自签名证书,如 CA2 可以用自己的私钥把自己的公钥和域名加密,生成证书
1.5 应用场景:https 协议
- 首先,浏览器向服务器发送加密请求
- 服务器将网页加密,连同自身的数字证书发送给浏览器
- 浏览器收到返回验证服务器身份,同时服务器也可以验证浏览器身份
- 浏览器验证服务器是通过 TLS 身份验证实现的,服务器验证浏览器是通过输入用户名密码实现的,通常服务器不会验证浏览器身份
- 客户端(浏览器)的“证书管理器”,有“受信任的根证书颁发机构”列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内

- 如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告

- 如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告

- 如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息
2. 小结
- 本文整理了一些数字签名、数字证书的知识,之前也有了解,但是一些概念细节理解不很清晰
- 现在做了整理,方便以后复习。也是对后面的铺垫
- 欢迎各位批评指正
3. 参考文献
Golang(十)TLS 相关知识(一)基本概念原理的更多相关文章
- Golang(十二)TLS 相关知识(三)理解并模拟简单代理
0. 前言 前面的介绍我们理解了数字签名等知识,同时学习了 OpenSSL 生成私钥和证书并验证 之前提过我们基于 BitTorrent 协议开发了一个 docker 镜像分发加速插件 中间涉及到了配 ...
- Golang(十一)TLS 相关知识(二)OpenSSL 生成证书
0. 前言 接前一篇文章,上篇文章我们介绍了数字签名.数字证书等基本概念和原理 本篇我们尝试自己生成证书 参考文献:TLS完全指南(二):OpenSSL操作指南 1. OpenSSL 简介 OpenS ...
- 来了解一下Mysql索引的相关知识:基础概念、性能影响、索引类型、创建原则、注意事项
索引的基础概念索引类似于书籍的目录,要想找到一本书的某个特定主题,需要先查找书的目录,定位对应的页码:存储引擎使用类似的方式进行数据查询,先去索引当中找到对应的值,然后根据匹配的索引找到对应的数据行 ...
- 客户端相关知识学习(十二)之iOS H5交互Webview实现localStorage数据存储
前言 最近有一个需求是和在app中前端本地存储相关的,所以恶补了一下相关知识 webView开启支持H5 LocalStorage存储 有些时候我们发现写的本地存储没有起作用,那是因为默认WebVie ...
- 【Stream—7】NetworkStream相关知识分享
一.NetworkStream的作用 和先前的流有所不同,NetworkStream的特殊性可以在它的命名空间中得以了解(System.Net.Sockets),聪明的你马上就会反应过来:既然是在网络 ...
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...
- listener监听器的相关知识
从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...
- 【转】java NIO 相关知识
原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...
- 【转载】前端面试“http全过程”将所有HTTP相关知识抛出来了...
原文:前端面试“http全过程”将所有HTTP相关知识抛出来了... 来一篇串通,一个http全过程的问题,把所有HTTP相关知识点都带过一遍 http全过程 输入域名(url)-->DNS映射 ...
随机推荐
- 【MySQL】多表查询&事务&权限管理
多表查询: 查询语法: select 列名列表 from 表名列表 where.... 例子: 创建部门表 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INC ...
- Solr集群(即SolrCloud)搭建与使用
1.什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud.当一个系统的索引数据量少的时候是不 ...
- Java中级知识归纳(二)
六.Java中Collection和Collections的区别? java.util.Collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法. java.util.Coll ...
- 2019年JVM最新面试题,必须收藏它
1.JVN内存结构 方法区和对是所有线程共享的内存区域:而java栈.本地方法栈和程序员计数器是运行是线程私有的内存区域. Java堆(Heap),是Java虚拟机所管理的内存中最大的一块.Java堆 ...
- 设置 WPF 的全球化语言
https://stackoverflow.com/questions/7454024/setting-culture-en-in-globally-in-wpf-app Thread.Current ...
- Innodb整体架构
如下图展示了Innodb内存中和磁盘的结构: 内存中结构主要有如下几种: buffer pool change buffer adaptive hash index (自适应的hash索引) Log ...
- INPUT输入子系统【转】
转自:https://www.cnblogs.com/deng-tao/p/6094049.html 1.Linux系统支持的输入设备繁多,例如键盘.鼠标.触摸屏.手柄或者是一些输入设备像体感输入等等 ...
- Paxos算法—前世
Paxos算法是基于消息传递且具有高度容错特性的一致性算法.我们将从一个简单的问题开始,逐步的改进我们的设计方案,最终得到Paxos,一个可以在逆境下工作的协议. 一.客户端-服务器模型 我们从最小的 ...
- 201871010105-曹玉中《面向对象程序设计(java)》第七周学习总结
201871010105-曹玉中<面向对象程序设计(java)>第七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这 ...
- 201871010108-高文利《面向对象程序设计(java)》第十二周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址> ht ...