• 怎样加密才能保证通信安全?


    整理自通俗大白话,彻底弄懂 https 原理本质

    场景

    众所周知,咱们军工行业越来越牛,对应的各个研究所之间的通信保密程度越来越高对吧!!
    现在有研究所A(以下简称A)和研究所B(以下简称B)之间进行通信交流,有如下几个问题:

    问题一:怎么保证通信安全呢?

    将通信的内容进行加密。

    问题二:使用哪种加密方式呢?
    • 单向加密:不行,A将通信内容加密后,B收到的是密文,无法获取原本的内容
    • 对称加密:可以,A通过密钥s将通信内容加密后,只要B拥有密钥s,就可以解密获取原本的内容
    • 非对称加密:可以,A通过自己的私钥将通信内容加密后,B通过A的公钥进行解密,同样可以获取原本的内容
    问题三:对称加密和非对称加密,如何选择呢?

    由于通信往往会交流频繁,数据交互多,所以加密解密要看重速度。

    • 对称加密:速度快
    • 非对称加密:速度慢

    所以,使用对称加密

    问题四:如何保证密钥s不泄露呢?

    大家也知道,随着咱们的技术越来越牛,国外的间谍对咱们的渗透也越来越强烈。如果,上诉对称加密的密钥s泄露并且被间谍f截取到,那么AB之间的通信内容是不是就被破解泄密了?
    那么如何保证密钥s不泄露呢?难道对密钥s也通过密钥s1进行对称加密?那s1泄露了怎么办?再加密再泄露。。。这种方法当然不行!
    所以要想保证密钥s不泄露,需要对密钥s进行非对称加密。由于密钥s文本短,所以可以忽略上述的非对称加密性能不好的缺点;并且只需要加密一次,保证安全的传输和获取密钥s后,后续的通信不需要再对密钥s加密解密了。

    暂时总结一下(1)
    • 研究所 AB为了通信安全,决定采用加密的方式,对通信内容进行加密传输
    • 比对性能,选用对称加密的方式进行加密
    • 为了防止对称加密的密钥s泄露被间谍f截取,怎么办?
    • 研究所A使用非对称加密,生成一对公钥、私钥,并且把公钥给B
    • B用公钥密钥s加密,传给A,由于需要A的私钥才能正确解密,所以并不怕间谍窃取到
    • 因为用的是A的公钥加密的,所以A用自己配对的私钥对其密文进行解密,获取到了密钥s
    • 此时,A和B就能用经过安全传输的密钥s进行对称加密的通信了
    问题五:遇到中间人攻击怎么办?

    上述总结中的情况,看起来是一个 安全的通信模式,可是如果研究所B获取到的公钥不是A真正的公钥,而是间谍f公钥呢?B还以为此时的公钥是A传递给自己的公钥!
    这是怎么回事呢?

    • B在获取A的公钥过程中,被间谍f掉包成自己的公钥后,发给了B
    • B还以为获取到的公钥是A的,其实此时已经被掉包成间谍f公钥了,就用间谍的公钥对密钥s进行加密,得到密文s0
    • 密文s0发给A的过程中,又被间谍拦截,间谍就用自己的私钥解密,得到了他们的密钥s
    • 间谍得到密钥s后,自己备份一份,再把此密钥s用A的公钥加密,得到密文s1,发给A
    • A得到密文s1后,用自己的私钥解密,得到密钥s
    • 此后,A和B就用对称加密密钥s进行通信了
    • 他们还以为是安全的,其实通信内容早就被间谍获取了。
    • 并不安全!
      这就是中间人攻击
      针对这种情况,为了安全通信,问题转变成了怎么安全的传输A的公钥呢?
    问题六:A怎么安全的把自己的公钥传输给B呢?

    到此,通过我们解决过的问题,已经知道了:

    • 如何安全的把通信内容传输给对方?
      解决方法:使用对称加密的方式进行通信
    • 如何安全的把密钥s传输给对方?
      解决方法:使用非对称加密方式,A把自己的公钥给B,B用A的公钥密钥s加密后传给A,A用自己的私钥解密,这个过程只有A能解密,所以是安全的

    现在,新的问题是公钥如何安全的传输给对方呢?难道再用对称加密或非对称加密?都不行!
    试想一下 ,生活中,我们最相信谁呢?谁最能提供最可信的消息或服务呢?当然是政府啊!
    如今,我从A那里下载获取的公钥已经不靠谱、不安全 了,那我们应该相信谁呢?到底应该从谁那里获取的公钥才是真正的公钥呢?
    所以,我们也搞一个机构,做一个大家都相信的机构,无条件百分百相信这个机构,这是规定。
    好,我们把这个机构取名叫做CA机构
    然后,我们把最后那个问题抛给这个CA机构,不管是研究所B也好,还是研究所C、研究所D等等,只要是想获取A的公钥,都从CA机构那里获取。
    那么,CA机构哪里来的A的公钥呢?当然是A给的啊,对于A来说,反正我已经把我的公钥给你CA了,你CA机构就要保证安全将我的公钥传输给别人。
    ok,那CA机构是怎么安全的传输公钥的呢?
    答案是数字证书数字证书就是用来解决公钥传输问题的!


    在解释数字证书的使用过程之前,我们先看看如下一个问题

    问题七:信件内容的传输过程中,如何保证内容不被篡改呢?

    结合前面说的加密知识,我们知道可以用单向加密算法,以md5加密算法举例

    • A给B写完信后,用md5算法对信件内容进行一次加密运算,得到一个唯一的字符串,我们把这个字符串起个名字,叫做摘要
    • A在信件的底部某块空处,写上自己用的单向加密算法md5,以及md5对信件内容运算出来的摘要,一块发给B
    • B收到信件后,看到信件底部是md5算法,于是就用md5对信件内容进行加密运算,得到B自己算出来的新的摘要
    • B将自己算出来的新的摘要和信件底部A写的摘要进行对比,如果相等,说明该信件的内容没有被人篡改过
    • 如果不相等,就说明该信件内容被别人篡改了

    ok,如上这个过程也会出问题的,如果间谍又出现了呢?如下:

    • 首先间谍截取信件了,把信件改了
    • 间谍用md5算法,重新把内容加密运算一次,得到新的加密字符串
    • 间谍把新的加密串,放在信件底部 ,发给了B
    • 此时B收到信件后,是没有办法判断出来该信件是不是被篡改过的

    所以,单纯的使用单向加密算法,生成摘要,是不能保证内容不被篡改的!

    问题八:如何保证信件的内容不被篡改呢?

    答案是签名!ok,我们用签名修改一下上面的例子,如下:

    • A用md5对信件内容进行运算,得到一个加密字符串 ,我们起名叫摘要
    • A用自己的私钥对摘要进行加密运算,得到另一个字符串,我们起名叫签名
    • A将加密算法md5摘要签名一块发给B
    • B用A的公钥签名进行解密,得到信件摘要1,假如为d1
    • B用md5对信件内容进行运算,得到信件摘要2,假如为d2
    • B对比d1和d2是否相等 ,相等说明信件内容没有被篡改过
    • 如果d1和d2不相等,说明信件内容已经被篡改过了

    此时,这个信件传输过程就是安全的了!
    ok,我们看看如果间谍截取到信件了呢?间谍可以修改信件内容,再次用md5算出一个新的摘要出来,但是信件上的签名,间谍是修改不了的!因为,签名是用A的私钥加密出来的,间谍是没有A的私钥的,所以即使间谍破解了签名,但是由于没有A的私钥,间谍无法生成新的A的签名
    而且 ,B在收到信件后 ,是会用A的公钥进行对签名解密的,如果间谍用自己的私钥摘要进行加密生成新的签名,那B是用A的公钥解密不了的,这个时候B就知道信件内容被截获并且被篡改过了的!

    暂时总结一下(2)
    摘要

    通过单向加密算法(如:md5),对内容进行加密出来的字符串,叫做摘要

    签名

    A用自己的私钥对摘要进行加密运算,得到的加密字符串,叫做签名

    验签

    B用A的公钥,对签名进行解密操作,解密出来的摘要和原来的摘要进行对比,这个过程叫做验签

    问题九:数字证书是怎么生成的?

    数字证书是有CA机构颁发的,首先如果研究所A想要有一个数字证书,就需要像CA机构申请。CA机构会给A颁发一张数字证书,里面包含了如下:

    • 公钥:A的公钥
    • 颁发者:CA(证书认证机构)
    • 有效期:证书的使用期限
    • 摘要算法:指定的摘要算法,用来计算证书的摘要
    • 指纹:也就是证书的摘要,保证证书的完整性
    • 签名算法:用于生成签名,确保证书是由CA签发
    • 序列号:证书的唯一标识

    知道了证书里面包含的内容,我们了解一下证书是如何产生的?

    • 将A的公钥、颁发者、有效期、摘要算法、哈希算法写入证书
    • CA根据证书中的指定的哈希算法,计算出整个证书的摘要,即digest
    • CA根据签名算法以及上一步计算出来的摘要,CA用自己的私钥对摘要进行加密,生成CA的签名, 即signature
    • 最后把摘要,签名以及证书的基本信息,一起发布,就得到了A的证书
    问题十:数字证书的作用

    从上面我们知道,数字证书就是解决公钥传输问题的,同时我们也知道,数字证书就是一个文件。
    那么,数字证书到底是怎么解决传输问题的呢?
    现在,A有了自己的证书了,我们就不会公开传输公钥了,只需要传输证书就行了。
    那么,A和B现在需要安全的通信,流程是怎么样的呢?如下:

    • A把自己的数字证书发送给B
    • 担心证书被间谍掉包,B需要对证书进行验证,验证什么呢?
    • 其实就是验证此数字证书到底是不是CA机构颁发的,不是CA机构颁发的证书,我们就认为传输是不安全 的
    • 验证数字证书是不是CA颁发的,需要有CA自己的数字证书(因为里面有CA自己的公钥)
    • 那我们去哪里找CA的数字证书呢?其实CA机构的数字证书存在于咱们电脑的操作系统里,不管是windows还是linux、mac,或者你刚买的电脑,里面都已经内置了非常多的CA机构的证书
    • 所以,电脑操作系统内的CA机构数字证书是可信的(除非安装的是盗版系统!!!)
    • 那么,我们就可以对数字证书进行辨别真伪了
    问题十一:怎么对数字证书进行验证?

    从上面可以知道:
    B收到了A的数字证书,首先对数字证书进行验证,验证此数字证书是不是CA机构颁发的
    因为我们的操作系统系统内置了所有CA机构的数字证书,所有我们可以对数字证书进行验证
    先回顾一下摘要和签名:

    摘要: 通过单向加密算法(如:md5),对内容进行加密出来的字符串,叫做摘要
    签名:私钥对上一步摘要加密,产生签名
    
    • 1
    • 2

    数字证书的验证流程如下:

    • B用内置的CA的数字证书,得到CA的公钥
    • A发过来的数字证书,我们假如叫做C, B用CA的公钥对C证书里的签名进行解密(查看问题九,C证书里的签名是用CA机构的私钥进行加密的,所以用CA的公钥进行解密),得到摘要D
    • B根据C证书里的摘要算法,假如写的是md5,则B用md5对证书证书整个内容进行计算,得到摘要D1
    • B对比摘要D和摘要D1是否相等
    • 如果D==D1,则说明此证书是CA机构颁发的,正版!
    • 如果D!=D1,则说明此证书不是CA机构颁发的,不安全,有风险!

    好了,如果证书通过验证了,就说明此证书的确是CA颁发的,B就可以从数字证书中拿到A的公钥了。
    至此,解决了问题六:A怎么安全的把自己的公钥传输给B呢?

    问题十二:完整的安全通信过程

    我们来看看A再次给B进行通信,就和前面不一样了,如下:

    • A把写完的信通过自己的私钥加密,并且在信的底部,附加上摘要算法,假如是md5,以及通过md5算出来的摘要
    • A用自己的私钥,对上一步的摘要进行加密,得到签名
    • A把摘要算法、摘要、签名都附加到信件底部后,再把自己的数字证书一起发给B
    • B收到信后,首先用自己的CA数字证书,拿到CA公钥,再用CA公钥对数字证书进行验证(也就是上面我们讲的流程)
    • 数字证书验证通过后,说明证书确实是CA颁发的,没有被篡改
    • B就从证书中拿到了A的公钥s
    • 有了A的公钥,接下来,就是对信件内容进行验证了

    对信件内容的验证流程如下:

    • B用从A的数字证书中获取到的公钥s,对信件的签名进行解密 ,得到摘要D1
    • B用公钥s信件内容进行解密(因为B收到的信件内容是通过A的私钥进行加密过的,所以需要用A的公钥进行解密),得到原始的信件内容m
    • B用摘要算法,对信件的原始内容m进行运算,得到摘要D2
    • B对比摘要D1是否等于摘要D2
    • 如果不相等,说明信件内容被人篡改过,不安全!
    • 如果相等,说明信件内容没有被篡改过,安全!
    • 相等的情况中,B就拿到了经过安全传输的A的通信内容了!
    总结

    以上内容包括了:加密解密、数字证书、摘要、签名、验签的过程。

  • 相关阅读:
    Matlab 常用快捷键
    Supervisor安装
    sealos踩坑记录
    基于Gin+Gorm框架搭建MVC模式的Go语言企业级后端系统
    八、Docker容器的数据管理
    第七章 查找 二、顺序查找
    SSM框架,MyBatis-Plus的学习(下)
    SEM 与 SEO 之间的区别与联系
    关于链表指针的深刻理解
    MySQL高级篇知识点——性能分析工具的使用
  • 原文地址:https://blog.csdn.net/qq_37279783/article/details/127797846