乐趣区

关于java:一文彻底搞懂加密数字签名和数字证书

微信搜寻????「编程指北」,关注这个写干货的程序员,回复「资源」,即可获取后盾开发学习路线和书籍

前言

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

在一旁玩手机的女朋友忽然问”你晓得数字证书是来干啥的不,为啥浏览器提醒证书不可信?”

你要说这个,那我可来劲了,于是乎从加密、数字签名始终讲到了数字证书。。。终于把女朋友讲睡着了,单独写下这篇文章。

注释

如果你能 十分清晰 的答复出以下问题,能够间接拉到最上面帮我点个赞~,把工夫用去陪陪女朋友:

  1. 非对称加密中公私钥都能够加密,那么什么时候用公钥加密,什么时候用私钥“加密”?
  2. 什么是数字签名,数字签名的作用是什么?
  3. 为什么要对数据的摘要进行签名,而不是间接计算原始数据的数字签名?
  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 机构应用本人私钥,对证书申请者的公钥进行签名认证。
    • 数字证书解决了如何平安散发公钥的问题,也奠定了信赖链的根底。

絮叨

大家如果感觉写得不错,能够帮帮点个关注,点赞~

你们的三连就是我创作的最大能源!

我是小北,一个每天在电脑前敲键盘的硬核男人,咱们下期见!

退出移动版