数字签名和数字证书究竟是什么?

我们经常会见到数字签名和数字证书的身影,比如访问一些不安全的网站时,浏览器会提示,此网站的数字证书不可靠等。那么究竟什么是数字签名和数字证书呢?本文就将通过一个场景深入浅出的介绍数字签名和数字证书的概念!

Bob有两个密钥,一个叫公钥Public Key,一个叫私钥Private Key。

image.png

Bob的公钥是公之于众的,所有需要的人都可以获得公钥,但Bob的私钥是自己私有的。密钥用来加密信息,将一段可以理解阅读的明文信息,用密钥进行加密,变成一段‘乱码’。因此,只有持有正确密钥的人,才能重新将这段加密后的信息,也就是‘乱码’,恢复成可以理解阅读的真实信息。Bob的两个密钥,公钥和私钥都可以将信息进行加密,并且能用对应的密钥将信息解码,也就是说,如果用Bob的公钥将信息加密,那么可以并且只可以用Bob的私钥将信息解码,反之,如果用Bob的私钥将信息加密,那么可以且只可以用Bob的公钥将信息解码!

image.png

所以Bob就可以利用自己的公钥和私钥进行信息的加密传输!

比如,Susan想要和Bob进行通信,考虑到信息的安全性,Susan可以利用Bob公之于众的公钥对所要传输的信息进行加密。这样,Bob收到信息后,就可以用自己的私钥对信息进行解码。假设此时有人窃取了Susan传给Bob的信息,但是由于没有Bob的私钥,无法对信息进行解码,所以即使窃取了信息,也无法阅读理解。

image.png

但是虽然黑客们无法解码Susan传给Bob的信息,却可以对信息进行篡改,破坏原有的信息,这样Bob收到被篡改的信息之后,再用自己的私钥进行解码,就会与Susan本来想要传达的信息出现不一致,这样也就相当于破坏了Susan和Bob的信息传输!学术上,我们将这种行为称为破坏信息的完整性!通俗的说,就是我得不到的信息,你也别想得到!

所以,现在的问题就是,我们如何保证信息的完整性,也就是保证信息不被破坏,或者说,当信息被破坏之后,接收方可以识别出,这个时候的信息是被破坏过的,就将其丢弃。

数字签名就可以解决上述的问题!根据数字签名,接收方接收到信息之后,可以判断信息是否被破坏过,如果没有被破坏,就可以正确的解码,如果被破坏,就直接丢弃。

数字签名可以保证对信息的任何篡改都可以被发现,从而保证信息传输过程中的完整性。

那么数字签名是如何实现对完整性保证的呢?关键技术就是hash,也就是哈希技术。

image.png

首先,Bob先对将要传输的信息进行hash,得到一串独一无二的字符,通常把hash之后的内容称为信息摘要message digest。我们都知道,hash往往是不可逆的,就是说,我们无法根据hash后的内容推断出hash前的原文。同时,不同的原文,会造成不同的hash结果,并且结果的差异是巨大甚至毫无规律的。也就是说,对原文进行再细微的修改,得到的hash后的内容都会与未经修改的原文的hash内容大相径庭。这样就保证了黑客对原文的任何修改都会被发现!

Bob同时将hash后的信息摘要,用自己的私钥进行加密,这样就保证只有Bob的公钥才能对信息摘要进行正确的解码,这样就保证了信息摘要一定是来自Bob的,也就是起到了一个独一无二的签名的作用。 加密后的信息摘要实际就是数字签名的内容。

image.png

最后,Bob再将数字签名附加到原文信息的后面,这样就形成了一个完整的带数字签名的信息报文。

image.png

Bob将带数字签名的信息报文传输给Pat。

Pat接收到信息之后,先利用Bob的公钥对数字签名进行解码,得到信息摘要,如果成功解码,就说明数字签名是来自Bob的,因为数字签名是Bob利用自己的私钥进行加密的,只有Bob的公钥可以进行解密。然后,Pat将信息原文进行hash得到自己hash的信息摘要,再与之前解码数字签名得到的信息摘要进行对比,如果相同,就说明原文信息是完整的,没有被篡改,反之,则确认信息被破坏了。

image.png

似乎现在,利用公钥和私钥以及数字签名,我们可以保证信息传输过程中的私密性和完整性。但还存在一个问题,就是公钥分发的问题,我们如果保证Bob的公钥被正确的分发给了Susan或者Pat等人呢?假设现在有一个中间人,他劫取了Bob发给Pat的公钥,然后私自伪造了一个假的公钥并加上Bob的名字,发给了Pat,这样就导致Pat永远实际上就是在跟中间人通信,和Bob也实际上在跟中间人通信,但都以为在跟对方通信。因此,现在的问题就是,Pat如何确认收到的公钥真的是Bob的公钥,而不是别人伪造的!

这个问题,其实可以类比一下现实生活中的问题。我们知道,公钥和私钥是成对存在的,也就是一个人一般都有一对独有的公钥和私钥。就好像我们每个人都有一个独有的身份证,我们把公钥类比为现实中的身份证,当我们在面对一个陌生人的时候,我们为了信任对方,一般可以查看对方的身份证,但此时就存在一个和上面中间人问题一样的漏洞,就是万一对方给的身份证是一个假的伪造的身份证呢?也就是万一对方给的是一个假的公钥呢?我们怎么识别真伪?现实中,我们往往会有一个身份证真伪的识别器,一般公安局等机构会有,也就是我们可以利用身份证真伪的识别器确认这个身份证的真假。我们仔细思考这个机制,实际上就是引入了一个独立的第三方机制,国家作为一个独立的第三方,给我们每个人创建了一个身份证,当我们需要验证身份证的真伪的时候,我们只需要找这个独立的第三方提供的真伪鉴别服务就可以验证身份证的真伪。

所以,相似的我们解决公钥分发问题的思路也就是引入一个独立的权威的第三方机构。

假设现在有一个数字证书的权威认证中心,这个中心会给Bob创建一个数字证书,这个数字证书包括了Bob的一些信息以及Bob的公钥。

image.png

那么,此时,想要跟Bob进行通信的人,就可以检查Bob的数字证书,然后向权威的数字证书的认证中心,去认证这是不是真实的Bob的数字证书,如果是,就可以从数字证书中获取到Bob的公钥,然后进行安全的通信。同时,就像现实生活中一样,我们不管进行任何涉及到资金或者安全问题的时候,都需要出示自己的身份证,并且对方会验证你的身份证的真假,也就是说,一个持有假身份证的人,或者没有身份信息的人是获取不了他人的信任的。同理,在网络通信中,如果在数字证书的认证中心中查询不到信息,那么就说明这样的通信方是不安全的,是不值得信任的!另一方面,数字证书除了解决了公钥分发和身份认证的问题,还加强了安全性。

详细的利用数字证书的通信过程如下:

Bob想要和Pat进行通信,首先就要告知Pat自己的公钥,Bob先向Pat发送自己的数字证书,Pat收到数字证书后,会向权威的数字证书认证中心进行认证,确认是否是Bob的数字证书。(这个认证的过程,实际上也是通过公钥和私钥的机制,Pat会根据数字证书的类别,查找发布这个数字证书的中心的公钥,然后用相应的公钥对证书进行家解码,如果能正确解码则说明这个数字证书确实是此中心颁布的,然后根据解码后的信息验证是否是Bob的数字证书,最后从解码后的信息中,获取Bob的公钥)。 然后,Pat可以利用Bob的公钥对Bob的数字签名进行解码,验证是否是Bob的数字签名,如果能正确解码,就说明数字签名是由Bob的私钥进行加密的。然后就进行完整性的验证,将信息原文进行hash,得到信息摘要,并与数字签名解码后得到的信息摘要进行对比,如果一致,就说明信息是完整的没有被篡改的!

image.png

上述的公钥分发和数字签名验证的过程似乎很复杂,但实际上,就跟我们验证身份证真伪一样,我们通常有一个识别器,只要将身份证放上去就可以得到结果,后面的实际过程往往不需要我们关心,网络通信中也是如此,往往会提供一个友好的用户接口,想要验证数字签名或者数字证书,其实就类似于我们点击一下按钮一样简单!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Scott_Mr 个人专栏

RxSwift 系列(三) -- Combination Operators

37370
来自专栏岑志军的专栏

数据安全及各种加密算法对比

24930
来自专栏blackheart的专栏

[信息安全] 1.密码工具箱

0. 何谓安全? 对于信息安全性的重要性,我想大家都不会否认。那么具体来说应该具有哪些特性才能称之为安全呢?举个简单的例子:我给你发送一条消息“借给我100元”...

233100
来自专栏窗户

python使用rsa库做公钥解密(网上别处找不到)

  使用RSA公钥解密,用openssl命令就是openssl rsautl -verify -in cipher_text -inkey public.pem...

55090
来自专栏技术换美食换不换

TOB服务部署安全模块

17440
来自专栏用户2442861的专栏

Qt学习之路_6(Qt局域网聊天软件)

http://www.cnblogs.com/tornadomeet/archive/2012/07/04/2576355.html

19510
来自专栏三好码农的三亩自留地

浅析 RxJava 2.x 线程调度

为了说明原理,排除干扰,这里用了最简单的逻辑。产生一个字符串“Hello rxJava”, 然后在监听中打印log,subscribeOn(Schedulers...

12210
来自专栏蔡卓伦的专栏

深入浅出 HTTPS 工作原理

HTTPS 涉及到了很多概念,比如 SSL/TSL,数字证书、数字签名、加密、认证、公钥和私钥等,比较容易混淆。我们先从一次简单的安全通信故事讲起吧,其中穿插复...

1.1K20
来自专栏草根专栏

RxJS速成 (下)

Subject Subject比较特殊, 它即是Observable又是Observer. 作为Observable, Subject是比较特殊的, 它可以对多...

36140
来自专栏Android开发实战

Security "Crypto" provider deprecated in Android N

我们知道加密[算法]都是需要密钥的,比如 AES 算法支持128 比特、192 比特和 256 比特三种长度的密钥,通常这些密钥会被转化成字节数组明文写在代码中...

15950

扫码关注云+社区

领取腾讯云代金券