一文完全搞懂加密、数字签名、数字证书!

有干货、更有故事,微信搜索【编程指北】关注这个不同的程序员,等你来撩~程序员

前言

这本是 2020 年一个平平无奇的周末,小北在家里刷着 B 站,看着喜欢的 up 主视频。算法

在一旁玩手机的女友忽然问”你知道数字证书是来干啥的不,为啥浏览器提示证书不可信?”编程

你要说这个,那我可来劲了,因而乎从加密、数字签名一直讲到了数字证书。。。终于把女友讲睡着了,独自写下这篇文章。浏览器

正文

若是你能很是清晰的回答出如下问题,能够直接拉到最下面帮我点个赞~,把时间用去陪陪女友:安全

  1. 非对称加密中公私钥均可以加密,那么何时用公钥加密,何时用私钥“加密” ?服务器

  2. 什么是数字签名,数字签名的做用是什么?微信

  3. 为何要对数据的摘要进行签名,而不是直接计算原始数据的数字签名?markdown

  4. 什么是数字证书,数字证书解决了什么问题?网络

这篇文章,主要围绕数字签名数字证书的原理以及它们的做用展开。函数

争取作到让不具有任何密码学基础知识的同窗都能听懂,因此在这里须要先对齐一些加密相关的概念 。

1. 什么是加密

加密就是对明文数据按某种特殊算法进行处理,使其成为不可读的一段代码,一般称为“密文“, 密文经过”密钥“解密后还原出原来的明文,经过这样的途径能够达到保护数据不被非法人窃取、阅读的目的。

定义简单吧?那来看个题,考虑如下哪些属于加密方法:

  • AES
  • RSA
  • MD5
  • BASE64
  • SM4

这几种都是平常开发中经常使用的数据编码技术,可是只有 AES、RSA、SM4 才能算是加密方法。

为何呢?一个区分的简单方法就是看编码后的数据是否还能还原,能还原的是加密。

MD5 其实是对数据进行有损压缩,不管数据有多长,1KB、1Mb 仍是 1G,都会生成固定 128 位的散列值,而且 MD5 理论上是不可能对编码后的数据进行还原的,即不可逆。

MD5 由于其具备不可逆性、单向恒定性(相同的数据屡次计算值不变)被普遍应用于文件完整性验证、口令加密以及接下来会讲到的数字签名中。

至于 BASE64 是否算作加密方法,仁者见仁。在这里不下结论,由于 BASE64 编码不须要密钥,且编码后的字符串任何人均可以解码出原串,因此通常不认为是加密方法。BASE64 经常使用来作转码,把二进制字节序列转化为 ASCII 字符序列。

2. 加密算法的分类

加密算法按照加解密使用的密钥是否相同,可分为:

  • 对称加密(Symmetric Cryptography)
  • 非对称加密(Asymmetric Cryptography)

1. 对称加密

对称加密是指加密和解密时使用同一个密钥。

2. 非对称加密

非对称加密是指加密和解密使用不一样的密钥,这两个密钥分别叫作「公钥」、「私钥」。

公钥是能够公开给全部人的,而私钥须要本身保密的。

公钥加密的数据只能用私钥解密:

同理,私钥“加密”的数据只能用公钥“解密”:

你们注意到没,我对 私钥“加密” 这里打了引号,为何呢?

由于私钥不是用来加密的,准确的说法应该是 「私钥签名,公钥验签」

这个问题不少同窗都存在误解,认为公私钥均可以用于加密。

实际上不是的,至于为何,后面讲完签名我会解释的。

3. 故事开始

为了讲这个故事,小北请来了密码学中经常使用的学术情侣,Alice 和 Bob,以及窃听者表明 Eve。

咱们从 Alice、Bob 约会的故事展开,来说讲其中暗藏着哪些危机,又是如何一步步化解的。

3.1 第一回合

九月,一个夜黑风高的晚上,Bob 想约 Alice 出来玩,因而给 Alice 发了一封邮件: 明文通讯

但咱们都知道网络是不可信的,而且因为消息在网络中是明文传输的,因此黑客能够轻易的截获、篡改甚至冒充 Bob。

来,咱们看看黑客 Eve 是怎么干的:

黑客窃听伪造

瞧,Eve 轻易的拿到了邮件内容 (窃听),而且修改了邮件内容 (篡改),甚至说他能够随时冒充 Bob 给 Alice 发送邮件 (假装)

若是上图中 Eve 伪造的内容被 Alice 接收到了,那么后果可想而知。

现实世界中,咱们天天都在经过网络进行聊天、转帐、浏览不存在网站。

若是都是这样明文传输数据,显然毫无安全感。

3.2 第二回合

既然咱们不能明文传输,那么 Bob 和 Alice 提早商量好密钥,使用对称加密对邮件内容加密不就行了~

对称加密

如今 Bob 发送的邮件都使用和 Alice 提早商量好的密钥加密后再传输。

因为没有密钥,Eve 就算截获到数据也没法获取邮件的内容,也无法篡改和冒充 Bob。

由于篡改后的数据必须使用密钥再次加密 Alice 才能正确解密。

那么只要 Bob 和 Alice 可以保证 密钥不泄露,整个通讯就是安全的。

若是密钥泄露,被中间人截获,那么就等同于明文通讯。

因此咱们不能把安全性寄托在人上面。

而且这里也存在一个问题,若是两我的不能线下见面, 如何在网上安全的交换密钥呢?

这彷佛是无解的,由于交换密钥的时候咱们必须明文通讯,否则对方根本看不懂。可是明文交换即意味着可能泄露。

可是别忘了咱们的密码学工具箱里还有一个好东西— 「非对称加密」

Bob 和 Alice 各自生成一对公私钥,由于公钥原本就是公开的,便可以被任何人获取,因此能够经过网络明文交换公钥。

而后使用公钥加密邮件内容后发送给对方,接收者使用本身的私钥便可解密。完美~

3.3 第三回合

来看看,在非对称加密体系下,Bob 如何给 Alice 发消息的。

首先 Alice 须要先生成一对公私钥,私钥只能 Alice 本身知道,公钥是可让任何人都知道的,所以可将公钥直接发送给 Bob,就算被截获也无所谓。

非对称加密

Bob 使用 Alice 的公钥加密邮件内容,加密后的内容只能由 Alice 的私钥解密,因此就算 Eve 截获也是徒劳。

反之,若是 Alice 想给 Bob 回信,就须要用 Bob 的公钥加密后发送。

这就解决了密钥交换问题,也保证了邮件内容不会泄露。也就是说如今能够防窃听

3.4 如何证实 Bob 是 Bob

不知道你注意到没有,这里也存在另一个问题:

Eve 也可使用 Alice 的公钥冒充 Bob 给 Alice 发邮件啊,由于 Alice 的公钥原本就是公开的,任何人均可以得到。

因为 Eve 也能够得到 Alice 公钥,因此无法防止 Eve 伪造篡改,而且对于 Alice 而言,她没法分辨出邮件究竟是 Eve 发的仍是 Bob。

因此这个问题的本质就是 「Alice 如何确认邮件来自于 Bob」

那么在生活中,咱们如何作这件事呢?

那就是让 Bob 在纸上签名而且按手印,由于指纹和字迹是 Bob 独有的,其它人很难伪造。

因此咱们须要在计算机中引入相似的机制:

即只有 Bob 本身可以产生的独一无二的标志,而且其它人可以验证这个标志确实是属于 Bob的。

这就是咱们今天要讲的主题—「数字签名」。

还记得什么是 Bob 独有的吗?

对,就是 Bob 本身的私钥,Bob 用本身的私钥对邮件内容计算一个「签名」,将「签名」和邮件内容一块儿发送出去,接受者 Alice 可使用 Bob 的公钥验证这个签名是否正确,这就叫「验签」。

若是不是 Bob 的私钥计算的签名,那么 Alice 用 Bob 公钥验签将会出错。

能够看到, Eve 试图使用本身的私钥计算签名而后发送给 Alice, 可是 Alice 使用 Bob的公钥进行验签时将会出错!

那么 Eve 可能篡改内容并冒充 Bob 的签名吗?不可能!由于内容发生改变时,对应的签名也须要从新计算,而签名的生成依赖于私钥,只要 Bob 的私钥不泄露,签名就不会被冒充。

啊啥?你说万一私钥泄露了怎么办?那就当我没说......

因此使用数字签名,咱们可以鉴别消息的发送者,也就是说黑客没法假装发送者进行发送数据,也没法篡改。

注意:

能够看出咱们这里数据是明文传输的,存在窃听风险。可是咱们为了阐述数字签名机制是如何运转的,故意将保证信息机密性的机制省略了。

若是想要保证数据的机密性,咱们常见的作法是,通讯双方经过非对称加密安全交换对称加密的密钥,后续通讯过程的数据都使用对称加密保证数据机密性。

而且「签名」的做用自己也不是用来保证数据的机密性,而是用于验证数据来源的防止数据被篡改的,也就是确认发送者的身份。

通常而言,咱们不会直接对数据自己直接计算数字签名,为何呢?

由于数字签名属于非对称加密,非对称加密依赖于复杂的数学运算,包括大数乘法、大数模等等,耗时比较久。

若是数据量大的时候计算数字签名将会比较耗时,因此通常作法是先将原数据进行 Hash 运算,获得的 Hash 值就叫作「摘要」。

「摘要」就像人的指纹同样,能够表明一我的,只要内容发生了改变,计算出来的摘要也应该变化。

「摘要」最好是不可逆转的,通常使用开头提到的 MD5 做为 Hash 函数,MD5 输出的结果固定位 128 位。

为何「摘要」最好是不可逆转的?

由于既然 Alice 能够用 Bob 公钥解开签名,那么理论上其它人,好比 Eve 也可使用 Bob 公钥解开签名拿到数据。

因此咱们最好对数据的「摘要」进行签名,这样,Eve 就算解开签名,拿到的也是「摘要」,若是摘要是不可逆转的,也就是没法从摘要反推出原文,也就达到了保密的做用。

发送者使用私钥对「摘要」计算数字签名。那么接收者如何验证呢?

接受者 Alice 收到后,取下数字签名,同时用 Bob 的公钥解密,获得「摘要1」,证实确实是 Bob 发的

( 画外音:若是使用 Bob 的公钥验证签名出错,那么签名必定不是 Bob 的私钥生成的)

再对邮件内容使用相同的散列函数计算「摘要2」,与上面获得的「摘要1」进行对比,二者一致就说明信息未被篡改。

这样两步分证实发送者身份和保证数据未被篡改。

3.5 这就够了吗?

Bob 和 Alice 如今能够依赖于对称加密进行保密通讯,也能够依赖于数字签名验证消息是不是对方发送的。

可是这一切的根基是创建在 Alice 持有的公钥确实是 Bob的,反之亦然。

什么意思呢?

试想,Eve 若是将本身的公钥冒充 Bob 发送给 Alice,而后 Alice 保存了下来,那之后凡是 Bob 发送的消息,反而会验证签名失败,被当作冒充者。 那你可能会问,为何 Eve 能够将本身的公钥发送给 Alice,而 Alice 绝不知情呢? 伪造公钥

看!咱们又回到了最初的起点,只不过此次被篡改的是公钥,以前是消息自己。

由于 Bob 的公钥是直接经过网络发送给 Alice的,因此 Eve 才能够在这一步作手脚,进行篡改,将本身的公钥冒充 Bob 发送给 Alice,也就是发送公钥这一步没有作到:

  • 防篡改
  • 防冒充

防篡改怎么和防冒充怎么实现的呢?

咱们前面讲了,就是靠数字签名! 可是数字签名须要接受者持有发送者公钥,才能进行验签。

而咱们如今处理的是分发公钥这一步,因此.......死锁了。这像是先有鸡仍是先有蛋的问题

如今的问题就是「Bob 没法证实它本身是 Bob」。

这个是否是似曾相识,之前去办事的时候常常被要求出具「我妈是我妈」这类证实。可是咱们本身说“我妈就是我妈”,人家根本不会信呀,须要一个可信第三方出具证实,好比派出所。

那么「Alice 如何才能确认 Bob 发送给本身的公钥确实是 Bob 的,而没有被篡改?」

在只有 Alice 和 Bob 两人的状况下是无法验证的。

因此,咱们这里也须要一个第三方帮 Bob证实 「Bob 的公钥就是 Bob 的公钥」,有点绕口令那感受了~

3.6 数字证书

为了解决这个问题,就引入了「数字证书」,什么叫数字证书呢?

百度百科:

数字证书是指在互联网通信中标志通信各方身份信息的一个数字认证,人们能够在网上用它来识别对方的身份。

所以数字证书又称为数字标识。数字证书对网络用户在交流中的信息和数据等以加密或解密的形式保证了信息和数据的完整性和安全性。

看了这个描述,是否是感受仍是云里雾里,仍是我用大白话来讲吧~

只要你理解了前面的数字签名,就能理解这里的数字证书,由于我把数字证书叫作「公钥的数字签名」。

为何呢?咱们引入数字证书的目的是为了保证公钥不被篡改,即便被篡改了也能识别出来。

而防篡改的方法就是数字签名,可是这个签名不能咱们本身作,缘由说过了,由于咱们的公钥还没分发出去,别人没法验证。

因此只能找可信的第三方来帮咱们签名,即证书颁布机构(CA),CA 会将:证书的颁布机构、有效期、公钥、持有者(subject)等信息用 CA 的私钥进行签名。

而且将签名结果和这些信息放在一块儿,这就叫作「数字证书」。

这样,Bob 就能够去 CA 申请一个证书,而后将本身的证书发给 Alice,那么 Alice 如何验证这个证书确实是 Bob的呢?

固然是使用 CA 的公钥进行验签。

注意:

CA 的公钥也是须要使用证书来分发的,因此 Alice 的电脑必须安装 CA 的证书,证书里包含了 CA 的公钥。

收到 Bob 发过来的数字证书后,Alice 使用 CA 的公钥进行验证,验证经过即证实这确实是 Bob 证书,也就可使用证书中包含的 Bob 的公钥,按照以前讨论的流程进行通讯。

那么 Eve 是否能够在中途篡改 Bob 的证书呢?

答案是不行,由于证书的信息使用 CA 的私钥进行签名,只要 Eve 修改了任何一个 Bit 都会致使最后签名验证不经过。

那 Eve 可不能够修改证书信息后本身从新计算一次证书的数字签名呢?

也不行,由于证书的数字签名计算依赖于 CA 的私钥,Eve 是拿不到 CA 的私钥的。

若是拿到了,说明什么?整个世界都是不可信的。

3.7 数字证书长啥样

这是我电脑中的自带的证书:

电脑自带证书

能够看到,包含了证书持有人的公钥和证书的签名。

另外,证书颁发机构是有层级关系的,下级 CA 的证书是须要由上级 CA 签名的。

换句话说必定存在根证书颁发机构,那么他们的证书是由谁签名的呢?

答案是自签,本身给本身认证。

这是我电脑中的一个自签的根证书颁发机构:

自签的根证书机构

为何根证书能够自签,谁来保证安全?

你把钱存在银行,你会担忧吗?咱们基于对国家的信任,才信任银行,这就是信任链的基础!咱们思考问题应该是分层的,若是不承认一个统一的基础,一直套娃下去,那么问题就无解。

那还有个问题,如何保证根证书的可靠性? 这是操做系统和浏览器预装的,由微软、苹果等操做系统厂商来选择根证书。

3.8 证书不可信?

那么什么状况下浏览器会提示 “证书不可信” 呢?

根据咱们上面的分析,下面是可能的缘由:

  1. 证书不是权威 CA 颁发

有些企业为了贪图便宜使用盗版的证书,没有通过 CA 认证。也就是没法使用浏览器内置 CA 公钥进行验证。

  1. 证书过时

上面说了,证书里有一项就是有效期,通常就是一年或者两年的时间。若是证书过时,那么浏览器就会提示“证书不可信”

  1. 证书部署错误

多是服务器证书部署出错,好比证书与域名不匹配,由于证书里有一项是持有人信息的。

好了,饶了一大圈,Bob 终于能够安全的向 Alice 发出前往红树林的邀请了~

附录

QA

如今咱们来回答文章开头提出的一些问题:

  1. 非对称加密中公私钥均可以加密,那么何时用公钥加密,何时用私钥“加密” ?

    • 加密场景,那么确定但愿只有我才能解密,别人只能加密。即公钥加密,私钥解密。

    • 签名场景,既然是签名,就但愿只能我才能签名,别人只能验证。即私钥签名,公钥验签

  2. 什么是数字签名,数字签名的做用是什么?

    • 数字签名就是使用私钥对数据摘要进行签名,并附带和数据一块儿发送。

    • 能够起到防篡改、防假装、防否定的做用。

  3. 为何要对数据的摘要进行签名,而不是直接计算原始数据的数字签名?

    • 数据可能比较大,签名是使用非对称加密算法,比较耗时
    • 防止第三方使用公钥解开签名后,拿到原始数据
  4. 什么是数字证书,数字证书存在解决了什么问题?

    • 数字证书就是由 CA 机构使用本身私钥,对证书申请者的公钥进行签名认证。

    • 数字证书解决了如何安全分发公钥的问题,也奠基了信任链的基础。

絮叨

你们若是以为写得不错,能够帮帮小北,点个「关注」,点个赞~

大家的三连就是我创做的最大动力!

我是小北,乾坤未定,你我皆是黑马,我们下期见!

文章持续更新,全文首发自个人我的公众号,能够微信搜一搜「 编程指北 」第一时间阅读,后台回复【pdf】有我搜集的上百本经典的计算机书籍电子版。

相关文章
相关标签/搜索