• 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. 参考文献

  • 相关阅读:
    复习提纲
    查看版本和存储的地方
    0到255的颜色
    stixel-world和psmnet结合出现的问题
    python plt 保存jpg出错
    三和韓長庚 著 正易 對讀 161-200
    startActivity、 startActivityForResult 、广播的使用
    01背包+卡精度 Hdu 2955
    c++ string 之 find_first_not_of 源码
    java:[1,0] illegal character: 65279 问题
  • 原文地址:https://www.cnblogs.com/wangao1236/p/11607147.html
Copyright © 2020-2023  润新知