对称加密和非对称加密、公钥和私钥、单向认证和双向认证、数字签名、数字证书、根证书

1. 什么是公钥和私钥?

摘自《什么是公钥和私钥?》

公钥(Public Key)与私钥(Private Key)是通过加密算法得到的一个密钥对(即一个公钥和一个私钥,也就是非对称加密方式)。

公钥可对会话进行加密、验证数字签名,只有使用对应的私钥才能解密会话数据,从而保证数据传输的安全性。公钥是密钥对外公开的部分,私钥则是非公开的部分,由用户(一般是服务端)自行保管。

公钥和私钥起初均存储在服务器端。 私钥是非公开的,因此仅存放在服务端,而且要避免被窃取,比如存在某网站A的服务器端;公钥是大家都可以获取的,一般是用在客户端,客户端的公钥是从哪来的呢?需要从服务器端获得,比如浏览器就是 一个客户端,当访问网站的时候,需要通过握手协议从网站侧获取

通过加密算法得到的密钥对可以保证在世界范围内是唯一的。使用密钥对的时候,如果用其中一个密钥加密一段数据,只能使用密钥对中的另一个密钥才能解密数据。例如:用公钥加密的数据必须用对应的私钥才能解密;如果用私钥进行加密也必须使用对应的公钥才能解密,否则将无法成功解密。

2. 加密算法

摘自:《什么是非对称加密?》

密码学中有两种技术:一种叫对称加密,另外一种叫非对称加密。

这次咱们主要聊聊非对称加密,因为公钥和私钥就是非对称加密的成果,但是为了更好的理解非对称加密,我们也会简单介绍对称加密

2.1 对称加密

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等。

基本逻辑是这样。如果 Alice 想把一个信息传递给 Bob 。比如信息是一个数字 m ,Alice 不能把这个数字直接传递给 Bob ,因为互联网是一个不安全的环境,很容易被窃听。所以她可以通过一个加密算法,比如,通过给 m 加上一个数字 e ,得到一个数字 c ,这个 c 就叫做密文。这样 Bob 拿到密文 c ,再减去 e 就可以得到信息 m 了。

在这里插入图片描述
因此,e就是对称加密算法中的密钥,并且只存在私钥,没有公钥概念。发送消息和接收消息二者持有的密钥是相同的。简单来说,对称加密就是加密与解密的步骤或方法完全对称,只需把步骤逆过来就行,与非对称加密相比,这里加密和解密步骤是简单的逆过来,因此只使用一种是密钥就可以实现。

比如,想要传递的 m 等于2,e 等于1,那么2+1得到密文就是3,3传递给 Bob 之后,Bob 用3-1得到信息 m 了。这个过程中,密文是可以放心的在互联网上传播的,被窃听了也没人能看懂。e 就是密钥,密钥如果一旦泄露了,通信过程就不安全了。当然实际中加密算法以及密钥都必须很复杂,不是简单的加一个数字,因为现在人们的解密手段其实也已经非常高超了。

对称加密的优势是可以加密大段信息,这个是非对称加密做不到的,但是对称加密的问题在于如何能够安全的把密钥传递给对方。因为如果 Alice 不能安全的把密钥传递给 Bob ,那么加密通信就实现不了。而如果不能实现加密通信,那又怎么可能安全的传递密钥呢,所以对称加密在互联网上使用,就有了这个鸡生蛋蛋生鸡的问题。非对称加密被发明出来,就是为了解决对称加密的这个最为致命的痛点。

举例说明对称加密密钥传输的问题:
由于单钥加密,同一个密钥既能加密,也能解密,那么必须谨慎的传播密钥,如果Alice 想把一个信息传递给 Bob ,用到了对称加密,那么密钥必须做到除了Alice和Bob之外,不能有第三个人知道。问题是如果Alice把密钥(其实就是一个字符串)拷贝到U盘,亲手把U盘拿给Bob,Bob再拷贝进电脑,这样是很安全的或者打电话也行,但是有没有考虑到网站对N个访问端,难道网站的开发者一个个的送U盘吗?显然不可取。但是如果直接通过网络发送密钥,很容易被窃取。

2.2 非对称加密

非对称加密也称公钥加密算法!

非对称加密之所以不对称,指的就是加密用一个密钥,而解密的时候用的是另外一个密钥。因此,我们称之为公钥和私钥,顾名思义,公钥可以任意对外发布;而私钥必须由用户自行严格秘密保管,绝不透过任何途径向任何人提供,也不会透露给要通信的另一方,即使他被信任。

2.2.1 非对称加密的重要性质

1.加密的双向性。

加密具有双向性,即公钥和私钥中的任一个均可用作加密,此时另一个则用作解密。
在这里插入图片描述
公钥加密,私钥解密;
私钥加密,公钥解密;
公钥加密,公钥无法解密!

2.公钥无法推导出私钥

必须确保使用公钥无法推导出私钥,至少妄想使用公钥推导私钥必须在计算上是不可行的,否则安全性将不复存在。

虽然两个密钥在数学上相关,但如果知道了公钥,并不能凭此计算出私钥;因此公钥可以公开,任意向外发布;而私钥不公开,绝不透过任何途径向任何人提供。

2.2.2 非对称加密算法应用

2.2.2.1 应用1 加密通信

这个过程是这样的。Bob 作为接收信息的一方,首先要生成一对密钥,一个叫做公钥,意思就是可以公开出去的密钥。另外一个叫做私钥,也就是要私密保存的。

注意:这个场景特指bob作为接收方,不是发送方!确切来说,这个是单向认证的例子。在单向认证的场景下,如果bob作为发送方的话,只能用私钥加密(这样公钥可以解密),这样接收方张三李四都持有公钥的话,可以互相窃取消息进行解密,这样是不安全的,本来发给张三的消息,李四可以窃取。如果要解密此问题,就要用到双向认证!

注意这一对儿密钥是有天然的数学联系的,不然也不可能用公钥加密后能用私钥解密。具体这个联系是什么,可以参考 RSA 算法 ,我们这里就不展开了。接下来,Bob 把自己的公钥传递给 Alice ,Alice 用 Bob 的公钥去加密信息 m 得到密文 c 。Bob 拿到密文 c 之后,用私钥解c得到m,注意这里就体现出来不对称了,因为 Bob 解密用的不是公钥,而是自己的私钥。

在这里插入图片描述

咱们思考一下这个过程里面的安全性。暴露在互联网上的首先是公钥,然后是密文,非对称加密的算法本身是公开的。但是即使公钥和密文算法都被攻击者拿到,他也不能解密拿到信息的(因为只能用私钥解,私钥仅被Bob 持有)。所以整个过程是安全的。

甲方只能用其私钥解密由其公钥加密后的任何信息。 非对称加密算法的保密性比较好,它消除了最终用户交换密钥的需要。

2.2.2.1.1 单向认证和双向认证

前文2.2.2.1 应用1 加密通信提到单向认证和双向认证概念,我们来分析下:

这个场景特指bob作为接收方,不是发送方!确切来说,这个是单向认证的例子。在单向认证的场景下,bob制作私钥和公钥,发布公钥,作为消息接收方,是安全的;

如果bob作为发送方的话,只能用私钥加密(为了保证接收方可以用公钥进行解密),这样接收方张三李四都持有公钥的话,可以互相窃取消息进行解密,这样是不安全的,本来发给张三的消息,李四可以窃取。

如果要解决此问题,就要用到双向认证!

此时张三也制作私钥和公钥,持有私钥,并把公钥发布给bob,如果bob想发消息给张三,就用张三提供的公钥加密,张三收到消息后,用张三的私钥进行解码,这样,李四即使获得bob的公钥、张三的公钥、bob发给张三的消息,也无法解密!

2.2.2.1 应用2 数字签名

非对称加密的另一个重要应用:数字签名

我们会在数字签名章节单独讲述

3. 数字签名

数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。

它是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术来实现的,用于鉴别数字信息的方法。

一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名是非对称密钥加密技术与数字摘要技术的应用。

是不是有点模糊,没关系,举了例子就立马清晰了。

在<2.2.2.1 应用1 加密通信>章节讲诉的例子,Alice 发送消息给bob,那么如果张三也发消息给bob的话,那么,bob如何区分消息的发送者是Alice 还是张三呢?简单,加个数字签名就行了!

数字签名就像我们写在信上的签名,是消息内容主体之外的另一个信息。

由定义可知数字签名的作用包含2种:

a)验证数据来源。

b)验证数据完整性。

报文摘要:
数字签名会用到报文摘要技术,我们先来介绍下报文摘要。

报文摘要:将报文按双方约定的HASH算法计算得到一个固定位数的报文摘要。在数学上保证只要改动报文中任何一位,重新计算出的报文摘要值就会与原先的值不相符。这样就保证了报文的不可更改性。

假如将一段报文“abcd”进行摘要计算,其hash值为"efgh",反复计算多次,其结果必然一致。一旦改动后,其值必不一致,如果将第一个字母a篡改为’y’,那么其结果必然不等于"efgh",因此,利用这种特性,可以用来验证内容是否被篡改。

将该报文摘要值发送者的私钥加密就得到报文的数字签名。

3.1 数字签名用法演示

在这里插入图片描述

应用数字签名时,需要发送者,例如Alice ,也需要生成一对密钥,一个公钥,一个私钥。公钥发布给bob,私钥要私藏。

简单解释,把A对应Alice ,B对应bob:

A:将明文Text进行摘要运算后得到摘要(消息完整性)H,再将摘要H1用A的私钥加密(身份认证),得到数字签名S,将密文M(用B的公钥对明文加密)和数字签名S一块发给B。

注意:数字签名是用Alice 的私钥,密文是用bob的公钥。

B:

  1. 收到A的消息后,先将密文 M’(密文可能被篡改,因此多个一个单引号,因为使用的公钥加密的,因此,张三也可以获得公钥,可以伪造一段自己产生的明文,也用公钥加密后,替换原有消息中的密文) 用自己的私钥解密,得到明文 Text’。

  2. 数字签名A的公钥进行解密后,得到原有的摘要H(签名是A的私钥,无法被修改,因此解密成功则说明A的身份被认证了,并且其内容就是之前的那个摘要H)。

    对明文Text’再次进行摘要运算,得到实际收到的摘要H’,将两份摘要进行对比,如果H=H’,则说明Text=Text’,消息没有被篡改(消息完整性),反之,说明消息内容被改过了。

一举两得,既能验证身份,又能验证消息的完整性。

3.2 数字签名存在问题

数字签名存在问题:中间人攻击

A如何安全的把自己的公钥发布给B,如果C截获A与B之间通信,把A的公钥换成C的公钥发给B,然后C冒充A与B进行通信,这个时候B是不知道他收到的数据是来自C的,可以实现中间人攻击。

B收到C发送的消息不可怕,可怕的是B外发消息时,会用C的公钥加密,B在和坏人通信,B输入的密码等信息都被坏人用私钥解密而截获了。

那么这里就要保证、不要使用坏人的公钥加密,那么怎么知道将要访问的网站的真正公钥,而不是被坏人替换了假的公钥呢?为了解决这个问题就出现了证书。

注意:中间人攻击的特点是截获并替换,可以理解是在网络的中间替换,并不能替换已经下载至本地的正确的公钥,后者属于物理替换,比如中病毒了或机器被远程控制了才可以。为什么这么说,是因为《数字签名是什么?》作者阮一峰 (当然好多别的网站也有,毕竟都是翻译国外的)里面提到:

复杂的情况出现了。道格想欺骗苏珊,他'偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。'
此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,
用自己的私钥做成"数字签名",写信给苏珊,让苏珊用假的鲍勃公钥进行解密

这里面提到偷走电脑是非常不恰当的,也是导致难以理解数字证书的根本原因!因为既然能偷走电脑了,为何不能替换根证书?这样后续就可以替换网络中的数字证书,进而替换公钥了!

4. 数字证书(Digital Certificate)

数字证书简称CA,它由权威机构给某网站颁发的一种认可凭证。颁发证书机构它也有一对公钥和私钥

证书机构用它的私钥A的公钥 和 一些A的信息 加密得到数字证书。然后A发送数据给B时,包含了三个部分:原文+数字签名+数字证书

如果数字证书是ok的,那么其内部存储的A的公钥就是ok的。

4.1 创建数字证书

在这里插入图片描述

数字证书=证书内容(注意是明文)+数字签名

如何验证内容是明文的?你可以尝试导出一个二进制的证书,用16进制查看,发限标记的地方是英文,是签发机构,说明是明文,否则应该看不到的:
在这里插入图片描述

Globalsign Root CA是Globalsign的根证书,GlobalSign的根证书是PKI生态系统中最古老,最受信任的根证书

数字证书的结构分为内容(类似报文)+对内容产生的签名。签名的作用是为了将来验证数字证书的。

步骤1 : 有一个权威的证书签发机构,称为CA——全球就那么几个公司比较权威啦,这个机构,先用RSA产生一对公私钥。

私钥自己留着藏起来,你要是能偷到手就厉害了。

步骤2: 先生成一个文件,文件内容大概是这样的:

  • 公钥内容
  • 签发者ID—-谁签发的证书
  • Subject—-也就是这个证书签发给谁。
  • 有效期
  • 其他信息

以上内容都是明文。我们称为内容P,具体内容如下:
在这里插入图片描述

  • 版本号version为证书的版本标识,目前最新版本为v3,若使用扩展项时,version=v3。

  • 序列号serialNumber为证书的唯一标识,每张证书的序列号不同。

  • 签名算法signatureAlgorithm和证书域中的签名算法相同。

    就是指的这个数字证书的数字签名所使用的加密算法,这样就可以使用证书发布机构的证书里面的公钥(公钥可以支持多种算法,因此需要告知使用具体哪一种),根据这个算法对指纹进行解密。指纹的加密结果就是数字签名。

  • 证书的签发者issuer是证书的颁发机构,是证书持有者的信任方。

  • 主体subject也是证书持有者,是证书的所属实体。

  • 有效期validity包含证书的生效日期和失效日期。

  • 主体公钥信息subjectPublicKeyInfo表示证书持有者的公钥信息。

    假设我们自己的公司叫"ABC Company",我们想申请证书,那么我们自己就要通过rsa算法生成公司的一对公钥和密钥,并且把公钥发送给机构,私钥自己保管

  • 主体唯一标识符subjectUniqueID 证书签发的唯一标识

  • 签发者唯一标识符issuerUniqueID表示证书持有者的唯一标识。

  • 扩展项extensions标识证书的扩展信息,可同时扩展多个信息。

步骤3: 然后使用hash算法,对内容P进行hash计算,得到一个摘要H

步骤4: 然后使用签发机构的私钥对H进行RSA加密,得到签名信息S。这个步骤称为签名,就是用私钥对某公开内容的hash值进行加密。

步骤5: 然后将内容P,S连成一个文件,这个文件就是所谓的数字证书了。所以数字证书里,包括证书持有者的身份信息,证书信息,证书持有人的公钥,以及机构的签名信息。

4.1.1 举例,CA如何给我们签发一个有效证书和服务器如何发送证书:

举个例子方便大家理解,假设我们公司"ABC Company"花了1000块钱,向一个证书发布机"SecureTrust CA"为我们自己的公司"ABC Company"申请了一张证书。

注意,这个证书发布机"SecureTrust CA"是一个大家公认并被一些权威机构接受的证书发布机构,我们的操作系统里面已经安装了"SecureTrust CA"的证书。

"SecureTrust CA"在给我们发布证书时,把Issuer,Public key,Subject,Valid from,Valid to等信息以明文的形式写到证书里面,然后用一个指纹算法计算出这些数字证书内容的一个指纹(这里是指证书上的数字签名),并把指纹和指纹算法用自己的私钥进行加密,然后和证书的内容一起发布,同时"SecureTrust CA"还会给一个我们公司"ABC Company"的私钥给到我们(当然建议我们自己公司创建私钥,把公钥提供给CA机构比较安全)。

例子中是公司自己的公钥私钥都有ca代办,当然建议我们自己公司创建私钥,把公钥提供给CA机构比较安全,因为CA发送私钥的万一出错呢?或者泄露呢?

我们花了1000块钱买的这个证书的内容如下:

×××××××××××××××证书内容开始×××××××××××××××××

Issuer : SecureTrust CA

Subject : ABC Company

Valid from : 某个日期

Valid to: 某个日期

Public Key : 一串很长的数字

…… 其它的一些证书内容……


数字签名

所以最后在我们使用https的时候究竟发生了什么:
在这里插入图片描述

  1. 客户端向一个需要https访问的网站发起请求。

  2. 服务器将证书发送给客户端,证书里面包含了服务器的公钥

  3. 客户端对证书进行校验
    这里要特别说一下客户端到底 如何来校验对方发过来的数字证书是否有效:

    • 首先在本地电脑寻找是否有这个服务器证书上的ca机构的根证书。如果有继续下一步,如果没有弹出警告。
    • 使用ca机构根证书的公钥对服务器证书的数字签名进行解密,得到md1。
    • 证书的内容是明文的,能得到签名算法signatureAlgorithm,利用公钥和相应的算法对明文再次计算摘要,得到md2。
    • 将md1和md2对比看是否一样,如果一样则通过认证。
  4. 校验成功之后,客户端会生成一个随机串然后使用服务器证书的公钥进行加密之后发送给服务器。

  5. 服务器通过使用自己的私钥解密得到这个随机值。

  6. 服务器从此开始使用这个随机值进行对称加密开始和客户端进行通信。

  7. 客户端拿到值用对称加密方式 使用随机值进行解密。

为什么不一直使用非对称进行加密,而是在类似握手之后开始使用对称加密算法进行https通信:

非对称加密的消耗和所需的计算以及时间远比对称加密消耗要大,所以在握手和认证之后,服务器和客户端就开始按照约定的随机串,对后续的数据传输进行加密。A如何把自己的数字证书发布给B,如果C截获A与B之间通信,把A的数字证书换成C的伪造的数字证书发给B,然后冒充A与B进行通信,这个时候B的根证书持有的CA的公钥无法打开数字证书,说明是假的

总结:
为了速度起见,客户端只在建立与服务器的连接时,使用非对称加密(利用数字证书中的服务器的公钥),这个阶段是为了交换一个共享密钥。接下来的过程使用的是对称算法。

回过头来,还记得文章开头上述非对称加密的作用吗?就是为了解决对称加密传输密钥容易被窃取的缺陷,而https没有粗暴的用非对称加密来替换对称加密,而是组合了这两种用法,利用非对称来传输对称加密的密钥!

在这里插入图片描述

再来个中文说明的图,意思差不多,但是更详尽:
在这里插入图片描述

4.2 数字证书究竟解决了什么问题

还记得<3.2 数字签名存在问题>章节的问题吗,那么数字证书是怎么解决普通数字签名的问题的?

首先我们回到主题,我们需要解决什么问题?问题就是“如何确保本地持有的公钥是要访问的网站的真正公钥,而不是被坏人替换了假的公钥呢

这里用到的是事先存储方法,就是事先将这个网站的公钥放在一个地方P,并且信任这个地方P上的所有公钥。

将来只要浏览器能识别出公钥来自P,那么也会认可该公钥。

于是存在某种机构,该机构不直接提供公钥,而是提供数字证书,把公钥放在证书内,将来只要浏览器识别数字证书是ok的,那么公钥自然也是ok的。

那么如何识别数字证书呢?只要给数字证书加上防伪码就行了!这个防伪码就是数字证书上的数字签名(证书内容计算摘要,再用CA的私钥加密,只能CA的公钥能解密)

浏览器程序有一个证书选项,里面有“受信任的根证书颁发机构”,还有你的系统里的证书管理工具里也有信任的机构,机构列表来源就是根证书,安装一个根证书,机构列表就多个一条记录,在你装上系统或者下载浏览器的时候自带的,也可以后天安装。

一个根证书对应一家CA机构,根证书内持有该CA的公钥,这个公钥可以查看防伪码,公钥用于验证数字证书是否是其签发的;具体步骤就是再次计算内容的摘要,与证书中的摘要进行对比。

注意:中间人攻击的特点是截获并替换,可以理解是在网络的中间替换,并不能替换已经下载至本地的正确的公钥,后者属于物理替换,比如中病毒了或机器被远程控制了才可以。为什么这么说,是因为《数字签名是什么?》作者阮一峰 (当然好多别的网站也有,毕竟都是翻译国外的)里面提到:

复杂的情况出现了。道格想欺骗苏珊,他'偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。'
此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,
用自己的私钥做成"数字签名",写信给苏珊,让苏珊用假的鲍勃公钥进行解密

这里面提到偷走电脑是非常不恰当的,也是导致难以理解数字证书的根本原因!因为既然能偷走电脑了,为何不能替换根证书?这样后续就可以替换网络中的数字证书,进而替换公钥了!

由上所知,预存在电脑上的根证书是不会被替换了(比如中病毒了或机器被远程控制了才可以),那么访问网站时,网站提供的数字证书就是可验证的,进而网站的公钥一定是安全的!这样就解决了中间人的问题!

B尝试访问网站A,A把自己的申请的数字证书发布给B,如果C截获A与B之间通信,把A的数字证书换成C伪造的数字证书发给B,然后C冒充A与B进行通信,这个时候B本地的根证书持有CA的公钥,可以发现数字证书是假的!

4.2.1 如何攻击数字证书呢

这个问题很有意思,正好也可以加深我们的理解
摘自《针对证书的攻击方法》

一 在公钥注册之前攻击 // 除了内鬼,谁会知道你注册公钥的时刻去截获呢?
二 注册相似人名进行攻击
三 窃取认证机构的私钥进行攻击 //顶级黑客才行,毕竟有CA公司被攻破,也引发倒闭的前车之鉴,但是现存的几家CA,呵呵,想攻破,难于上青天
四 攻击者伪装成认证机构进行攻击 //相对来说容易实现,只要让用户安装你的假根证书,让浏览器认为攻击者是合法的CA即可

因此,也提醒大家,在安装根证书时,需要小心再小心,当然即使是程序员,也难以区分根证书的!


参考:
《公钥与私钥,HTTPS详解》
《SSL证书原理讲解》 参考数字证书交互方式
《数字签名是什么?》作者 阮一峰 参考留言

猜你喜欢

转载自blog.csdn.net/m0_45406092/article/details/114578536
今日推荐