QCon全球软件开发大会9折优惠倒计时,了解详情 了解详情
写点什么

你了解数据安全传输吗?

2021 年 7 月 31 日

你了解数据安全传输吗?

HTTPS 认知


HTTPS 其实是 HTTP + SSL 协议组成的安全协议。


我们知道,从我们输入 URL 到页面呈现的过程是作用于 HTTP 协议的,HTTP 协议保证我们网络传输数据的基础,但是安全性无法保证,而 SSL 协议作用于 Http 协议就能解决安全问题。


HTTPS 保证以下三点:


  • 数据内容加密

  • 数据完整性保护(数字摘要、数字签名)

  • 身份认证


HTTPS 保证安全性要点:


  • 握手阶段:使用 非对称加密技术 对 公钥 进行加密

  • 传输阶段:使用 对称加密技术 对 报文 进行加密


由于 HTTPS 多了一层使用非对称加密算法对公钥进行加密的过程,因此建立连接的时间比 HTTP 要慢。

握手阶段保证了连接是安全的,那么后续的数据传输就可以安全的进行传输,因此可采用耗时较少的对称加密算法对报文进行加密传输。


HTTPS 解构


在上图中,我们看到 SSL 协议的作用,在了解保证数据安全的 SSL 协议之前,我们先了解一些关于数据安全涉及的一些概念。


加解密相关概念

对称加密

别名: 私钥加密、单密钥算法、传统密码算法。

概念: 指使用 相同的密钥 进行加解密,因此从加密密钥可以推算出解密密钥,也可以从解密密钥推算出加密密钥。

常见的对称加密算法: DES(Data Encryption Standard)、AES(Advanced Encryption Standard)、RC4、IDEA

非对称加密

别名: 公钥加密

概念: 公钥是对外公开的,私钥存储在通信两端的各自手里。客户端跟加密的公钥形成一对密钥对, 服务端跟加密的公钥形成另外一对密钥对,加解密的密钥是成对的

限制: 加密内容的长度不能超过公钥的长度

数字摘要

别名: 数字指纹

概念: 明文采用单项 Hash 函数生成的一串固定长度(128 位)的密文。

数字签名

概念:非对称密钥加密技术和数字摘要的混合应用

数字签名过程

1、发送者使用 Hash 函数 (H) 将原文生成数字摘要 A

2、发送者使用自己的私钥, 对数字摘要 A 进行加密, 生成密文 CypherA

3、将密文 CypherA 与原文一起传送给接收者

数字签名验证(信息的完整性)过程

1、接收者使用 Hash 函数  (H) 将接收到的原文生成数字摘要 B (B === A, H 函数是一样的)

2、接收者使用公钥,对接收到的加密密文 (CypherA) 进行解密, 得到数字摘要 B'

3、对比 B' 与 B 是否相等, 如果相等,说明收到的信息是完整的并且消息确实是由该发送方签名并发送的(因为私钥只有发送方自己知道),在传输过程中没有被修改;否则信息被修改

最后比较数字摘要 A 与数字摘要 A'是否相等,也可以逆向使用 Hash()函数,将摘要 A'进行还原得到明文,比较改明文与传过来的原文是否一致(都是 pig)。

数字签名 是个 加密 的过程,数字签名验证 是个 解密 的过程。一次数字签名涉及到一个哈希函数、接收者的公钥、发送方的[私钥]。

伪代码
// 单项 Hash 函数fucntion Hash (plainText) { // 传入明文参数  // 明文加密过程  const encryptedAbstract = encrypt(plainText)  // 返回固定长度(128 位)的数字摘要  return encryptedAbstract}
// 发送者使用自己的私钥对明文产生的数字摘要进行加密, 生成密文 CypherAfunction doEncrypt (senderPrivateKey, encryptedAbstract) {  const CypherA = encrypt(senderPrivateKey, encryptedAbstract)  return CypherA}
// 发送报文function sendMessage (plainText) {  const encryptedAbstract = Hash(plainText)  const CypherA = doEncrypt(senderPrivateKey, encryptedAbstract) // 加密  return {    CypherText: CypherA,    originText: plainText  }}
// 接收者用公钥解密function doDecrypt (publicKey, encryptedAbstract) {  const decryptedAbstract = decrypt(publicKey, encryptedAbstract)  return decryptedAbstract}
// 接收报文function receiveMessage (CypherA, plainText) {  const encryptedAbstract = Hash(plainText)  const decryptedAbstract = doDecrypt(publicKey, encryptedAbstract) // 解密  if (decryptedAbstract === encryptedAbstract) {    console.log('1、the sender is true') // 消息发送者的确认    console.log('2、the message is complete') // 消息完整性的确认  }}
const message = sendMessage(plainText) // 数字签名过程receiveMessage (message.CypherText, message.originText) // 数字签名认证过程
复制代码

数字证书


在上述数字签名的过程中,我们如何保证这个公钥是可信任的?这就是数字证书存在的必要性。

数字证书主要用于加密、签名、身份认证。

数字证书由 证书颁发机构(CA, Certification Agent) 颁发, CA 会在颁发证书之前以及使用证书时对持有者的身份进行验证,它让客户端有能力去识别公钥是否来自合法的服务器。

证书颁发机构(CA) 颁发包含公钥和所有者身份的数字证书。匹配的私钥不是公开的,而是由生成密钥对的最终用户保密。证书还是 CA 的确认或验证,证书中包含的公钥属于证书中标注的个人,组织,服务器或其他实体。CA 在此类方案中的义务是验证申请人的凭证,以便用户和信赖方可以信任 CA 证书中的信息。

当您访问使用 HTTPS(安全连接)的网站时,该网站的服务器会使用证书向浏览器(如 Chrome)证明该网站的身份。证书中包含的公钥信息是可信任的, 如果证书不存在、证书被篡改、证书失效等情况,浏览器会在左上角提示你该网站不安全。

签名验证链条:client <- 服务器 <- CA

数字证书的内容
  • 证书颁发机构的名称

  • 证书本身的数字签名

  • 证书持有者公钥

  • 证书签名用到的 Hash 算法

  • ... 等等


公钥和数字签名


了解这些基本概念后, 进入我们今天的主题:SSL 协议如何保障数据安全传输

SSL/TLS


SSL(Secure Socket Layer, 安全套接字层)

利用加密技术,确保数据在网络传输过程中不会被窃取。


TLS (Transport Layer Security,传输层安全协议)

用于两个应用程序之间提供保密性和数据完整性。

该协议建立在 SSL3.0 协议的基础之上,可理解为 SSL3.1 版本。只不过在 SSL3.0 的基础上采用了一些更安全的策略,让数据更加安全,其他的协议分层与功能与 SSL 一致。有兴趣的可自行了解其与 SSL 的区别与优势。

SSL/TLS 协议的作用:
  • 数据加密,防止被窃取

  • 保护数据的完整性,确保数据不会被改变

  • 身份认证,确保数据被发送到正确的客户端和服务器

可以看到, 这正是 HTTPS 协议发挥作用的三点。

那么, SSL 协议到底是如何把我们数据进行加密,从而进行安全传输的呢?

SSL、TLS 的握手过程

1、客户端告知服务端自己支持的 安全协议版本(如 TLS1.0)加密算法压缩方法随机数 CRandom1

2、服务端首次响应,返回给客户端 安全协议的版本加密算法压缩方法随机数 SRandom, 还有一个 数字证书(服务器证书)

3、客户端对服务端发送过来的证书进行验证,验证通过后,进行如下操作:

  • 客户端再次产生一个随机数 CRandom2

  • 使用服务器证书中的公钥对数据进行进行加密,生成随机数 CRandom3

  • 发送 ChangeCipherSpec(编码改变)的消息通知(告知服务器我已经准备好用我们之前商量好的加密套件进行加密并传输数据了) 、前面 所有消息的 hash 值 以及 加密数据 CRandom3 进行服务器验证

  • 使用与服务器确认的加密算法对 CRandom1、CRandom2、CRandom3 三个随机数进行加密,生成 Session Secret(这个就是后边使用对称加密算法进行传输数据时所用到的对称加密密钥,还可用来 会话恢复, 节约 SSL 的握手时间)

4、服务器再次响应:

  • 使用自己的私钥对 CRandom3 进行解密、并对解密后的数据进行验证

  • 发送 ChangeCipherSpec(编码改变)的消息通知(告知客户端我也准备好了用我们之前商量好的加密套件和 Session Secret 进行加密数据了)

  • 使用 Session Secret 加密一段 Finish 的消息发送给客户端, 以验证之前通过握手建立起来的加解密通道是否成功


到上面四步,客户端与服务器已经确定了密钥,就可以对消息进行加密传输了。


到此,握手过程结束。


整个握手阶段的安全,取决于第三个随机数 CRandom3 能否被破解,因为这个随机数是使用服务端的公钥进行加密的、服务端的私钥进行解密的;而私钥只存储在了服务端本身。


在所有的握手阶段都完成之后,就可以使用对称加密技术开始传送应用数据了。


QA

1、客户端如何对接收到的证书进行验证的?

证书本身就已经告诉客户端怎么验证证书的真伪。也就是证书上写着如何根据证书的内容生成证书编号。客户端拿到证书后根据证书上的方法自己生成一个证书编号,如果生成的证书编号与证书上的证书编号相同,那么说明这个证书是真实的。

2、公钥的安全性是通过证书来确认的, 但是证书是由颁发机构来颁发的, 那如何确认这个颁发者是可信的呢?

通过证书链。


  • root:根证书,权威证书认证机构 (CA, Certificate Authority) 给自己颁发的数字证书,也就是自己认证自己。在上图中根证书就是由 DigiCert Global Root CA 自己给自己签发的。

  • intermediates:中间证书,根 CA 生成一对公钥、私钥,并用私钥将中间 CA 的信息和公钥进行 “加密” 生成签名,封装得到中间证书。需要注意的是,中间 CA 可能不止一个。上一级 CA 同样按照这个逻辑给下一级 CA 进行签发证书。在这里中间 CA 就是 RapidSSL RSA CA 2018,它给末端使用者签发证书。

  • end-user:末端使用者(证书)。图中的末端证书就是 *.juejin.im 使用的数字证书。


可以看到证书链由多个证书一层一层组成的。末端证书的公钥是给用户加密报文外,其他层证书中的公钥均用于解密下一层的证书指纹签名。最高层的根证书是自签名的,也就是自己颁发给自己,所以 根证书一定是可信的(难道自己还不能信任自己吗?^^)


总结


网络安全传输数据依赖 SSL 协议,而网络传输的协议是 HTTP, 因此构成了 HTTPS 协议。而 HTTPS 要保证客户端与服务器端的高效通信安全,必须使用对称加密算法,但是协商对称加密算法的过程,需要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程本身也不安全,会有中间人篡改公钥的可能性,所以客户端与服务器不直接使用公钥,而是使用数字证书签发机构颁发的证书来保证非对称加密过程本身的安全。这样通过这些机制协商出一个对称加密算法,就此双方使用该算法对数据进行加密解密传输,从而解决了客户端与服务器端之间的通信安全问题。


笔者简单带大家了解了数据安全传输的关键点, 其实关于安全的话题还有很多值得深入的点,欢迎大家给我留言~ 共同学习,共同进步。



头图:Unsplash

作者:鄢栋

原文:https://mp.weixin.qq.com/s/-sFlCYJjWOoUp8KyzSjiWA

原文:面试官:你了解数据安全传输吗?

来源:微医大前端技术 - 微信公众号 [ID:wed_fed]

转载:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2021 年 7 月 31 日 16:001120

评论

发布
暂无评论
发现更多内容

对EF Core进行扩展使支持批量操作/复杂查询

Spook

EF Core

数据归档 - 冷热数据处理大师

趣链科技

数据处理 区块链+

CDH 安装搭建(二)

大数据技术指南

CDH 7月日更

全网首发!“阿里爸爸”最新出品SpringBoot高级笔记(内部笔记!)

Java 白

Java spring

就是它,帮我斩获了8家大厂offer,由于太全被各大厂要求Github连夜下架

Java架构师迁哥

腾讯T4架构师:刷3遍以下面试题,你也能从小公司成功跳到大厂

程序员改bug

Java spring 程序员 面试 编程语言

面试前的必刷题汇总:多线程+JVM+微服务+Redis+MySQL

程序员改bug

Java spring 架构 编程语言

mPaaS 月度小报 | CodeDay#6 成都站落幕,下一站北京;上新季:新容器、新官网、新视觉

蚂蚁集团移动开发平台 mPaaS

mPaaS 移动开发平台

数据安全法下,企业如何平衡数据安全合规与业务性能?

腾讯安全云鼎实验室

数据安全 数据安全法

面试官问的那些Android原理你都懂吗?快来收藏!

欢喜学安卓

android 程序员 面试 移动开发

CODING 助力推进腾讯游戏国际化进程

CODING DevOps

开发工具 CODING DevOps 腾讯游戏 软件研发

部分简单网页的基础了解

Emotion

html html5 Html报文解析 内部样式、 CSS语法

MySQL连接数管理

Simon

MySQL

linux网络编程—7层网络以及5种Linux IO模型以及相应IO基础

Linux服务器开发

网络编程 后端开发 Linux服务器开发 网络模型 IO模型

字节跳动有状态应用云原生实践

火山引擎开发者社区

云原生 后端

DICOM--网关(路由器/适配器)

鸟哥

医学影像 DICOM PACS dicom4che DICOMWeb

自制深度学习照片数据集

re-执着

卧薪尝胆30天!啃透京东大牛的高并发设计进阶手册,终获P7意向书

云流

Java 编程 程序员 架构 面试

腾讯上线零点巡航,用Java手撕一个人脸识别系统

北游学Java

Java 腾讯 人脸识别

面试官问的那些Android原理你都懂吗?值得一看

欢喜学安卓

android 程序员 面试 移动开发

iOS端屏幕录制开发指南

anyRTC开发者

音视频 WebRTC ios开发 屏幕录制

这套获50w+星标的算法神仙文档,足你解决90%的对手,牛逼

云流

编程 程序员 架构 面试

手把手教你实现聚光灯效果

森友小锘

前端 可视化 智能灯控 数字孪生

灵魂拷问:我们该如何写一个适合自己的状态管理库?

尔达Erda

开源 云原生 前端 API 运维开发

YOLOV1解读

re-执着

共36万字!为上岸Alibaba,我把Github上Java面试题都整理了一遍

云流

Java 编程 程序员 架构 面试

爱了!阿里巴巴 Java 面试参考权威指南(泰山版)5月版开源

云流

Java 编程 程序员 架构 面试

开源即巅峰!阿里首次分享:Java架构师全栈“成长笔记”

Java架构师迁哥

Hive学习笔记(一)

五分钟学大数据

hive 7月日更

就这一次,20张图带你彻底击溃Redis跳表

程序员小毕

Java redis 程序员 数据结构 面试

《持之以恒的从事运动》三

Changing Lin

数据库运维技术发展与展望

数据库运维技术发展与展望

你了解数据安全传输吗?-InfoQ