【JavaWeb】消息摘要、数字签名与数字证书的区别

前言

结合我之前写的【Java基础】加密与安全基础【JavaWeb】浅谈接口安全设计指南(含源码) 【JavaWeb】如何优雅的实现第三方开放api接口签名(有状态/无状态)可以在看本文章时更加熟悉 “加密以及安全”的基础概念

一.消息摘要(Digest)

什么是消息摘要?

  • 对一份输入数据进行一个不可逆的 Hash计算,生成一个固定长度的 Hash 值,这个值就是这份数据的摘要(Digest),也称为指纹。摘要算法(Digest)又称 哈希算法(Hash)

摘要算法

  • 常见的摘要算法有 MD5、SHA-1、SHA-256等。

特点:

  • 同一个摘要算法,无论输入的数据是什么,输出都是相同长度的值。 如: MD5,无论数据有多大,输出总是128位的散列值。
  • 摘要算法是不可逆的,只能根据原始数据计算出它的摘要值,但是不能根据摘要值反推出原始数据。
  • 越优秀的摘要算法越难找到Hash碰撞。 虽然长内容生成短摘要必定会产生碰撞的,但一个优秀的摘要算法很难主动构造出两条数据,使得他们的摘要值相同
  • 相比加密算法(对称和非对称),摘要算法速度都相对较快

使用场景:校验数据(消息)的完整性数字签名

  • 消息完整性:由于每一份数据生成的MD5值不一样,因此发送数据时可以将数据和其MD5值一起发送,然后就可以用MD5验证数据是否丢失、修改。

  • 安全访问认证:根据摘要算法不可逆性质,(就是无法从MD5值中恢复原数据)对账号登陆的密码进行MD5运算然后保存,这样可以保证除了用户之外,即使数据库管理人员都无法得知用户的密码。

  • 数字签名:这是结合非对称加密算法和CA证书的一种使用场景。
    一般破解方法:字典法,就是将常用密码生成MD5值字典,然后反向查找达到破解目的,因此建议使用强密码

以代码【Java工具类】摘要算法之MD5、SHA1工具类为例:将本地计算出文件的MD5,可以和数据源提供的MD5做对比,如果相同则文件是完整的。

Hash算法的简介可以查看文章 【Java基础】加密与安全基础 的 第二节,有详细介绍

二.数字签名(digital signature)

1.概述

非对称加密体系中,如果用「公钥」对数据加密,用「私钥」去解密,这是「加密」; 反之用「私钥」对数据加密,用「公钥」去解密,这是「签名」

加密与签名的使用场景不一样:

  • 由于所有人都持有公钥,所以「签名」并不能保证数据的安全性,因为所有人都可以用公钥去解密。 但「签名」却能用于保证消息的准确性和不可否认性。因为公钥和私钥是一一对应的,所以当一个公钥能解密某个密文时,说明这个密文一定来自于私钥持有者

2.举例说明

  1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥。
    在这里插入图片描述

  2. 鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。

在这里插入图片描述

  1. 苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。
    在这里插入图片描述

  2. 鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。
    在这里插入图片描述

  3. 鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用Hash函数,生成信件的摘要(digest)
    在这里插入图片描述

  4. 然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名(signature)"

在这里插入图片描述

  1. 鲍勃将这个签名(signature),附在信件下面,一起发给苏珊。
    在这里插入图片描述

  2. 苏珊收信后,取下签名(signature),用鲍勃给的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。

在这里插入图片描述

  1. 苏珊再对信件本身使用Hash函数,将得到的摘要(digest)与上一步使用公钥解密得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。
    在这里插入图片描述

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

在这里插入图片描述

  1. 后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找"证书中心"(certificate authority,简称CA)为公钥做认证证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)
    在这里插入图片描述

  2. 鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名(signature)的同时,再附上数字证书就行了。
    在这里插入图片描述

  3. 苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的
    在这里插入图片描述

3.签名和验证的流程

请求发送者

  • 持有 私钥 和 加密算法,称为信源,并用私钥和加密算法对明文数据进行加密,得到密文数据,称为签体sign
    接着把明文数据签体(密文数据)同时发给请求接收者

请求接收者

  • 收到请求后,先取出签体(密文数据)用公钥对密文解密,得到一份明文数据,再将解密后的明文数据和收到的明文数据做对比,如果相同则数据完整且可信
    在这里插入图片描述
    即使他人截获并篡改了「明文数据」,由于「私钥」是保密的,篡改者也无法生成正确的「签体」。所以签名能保证消息的准确性

但在单独使用非对称加密的数字签名方案时,要对所有明文消息进行加密,效率很低。怎么提高效率呢?

将摘要算法和非对称加密结合使用

如何签名:先用摘要算法计算明文数据的摘要值再对这个摘要值用私钥加密。这样就能较快速地得到了原始信息的签名
如何验证:先用相同的摘要算法计算原始信息的摘要值,再用公钥对签名解密,得到收到的摘要值,最后对比这两个摘要值判断是否相等。如果不相等说明数据不可信。

三.数字证书(digital certificate)

1.概述

公钥是公开的并且可以自行导入到电脑,比如C偷偷在B的电脑用自己公钥C替换了A的公钥,然后用自己的私钥C给 B 发送Email,这时B收到邮件其实是被C冒充的但是他无法察觉。 因此如果公钥本身都被篡改了,这个签名方案就不正确了。所以需要有某种方式确保公钥的正确性,这就是 "数字证书"

  • 因为任何人都可以生成自己的(公钥,私钥)对,所以为了防止有人散布伪造的公钥骗取信任,就需要一个可靠的第三方机构来生成经过认证的(公钥,私钥)对。目前,世界上最主要的数字服务认证商是位于美国加州的Verisign公司,它的主要业务就是分发RSA数字证书

数字证书作用确保数据接收者的公钥是没有被篡改过的。

2.举例说明

在这里插入图片描述
下面,我们看一个应用"数字证书"的实例:https协议。这个协议主要用于网页加密。

  1. 首先,客户端向服务器发出加密请求。

在这里插入图片描述

  1. 服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端
    在这里插入图片描述

  2. 客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。

谷歌浏览器
在这里插入图片描述

  1. 如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。
    在这里插入图片描述

  2. 如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。

在这里插入图片描述

  1. 如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。
    在这里插入图片描述

3.数字证书验证流程

数字证书通常包含以下内容:

  1. 证书所有人的公钥;
  2. 证书发行者对证书的数字签名;
  3. 证书所用的签名算法;
  4. 证书发布机构、有效期、所有者的信息等其他信息。

    数字证书的验证过程需要用到CA根证书业务相关证书根证书 是预装在操作系统中的。

CA根证书的生成

  1. 认证机构利用RSA等算法,生成一对 公钥K1 / 私钥K2
  2. 公钥K1和 证书发布机构、有效期等信息组成一份原始的证书内容,设为 C1
  3. 利用某种摘要算法,计算原始内容 C1 的生成摘要H1
  4. 用第一步生成的私钥K2,对摘要H1签名,得到签名S1
  5. 原始内容C1 和 签名S1合在一起,就得到了 证书

K1、K2:认证机构生成的公钥、私钥
C1: 公钥K1+证书发布机构、有效期等信息组成的内容
H1: C1 生成的摘要
S1:私钥K2对摘要H1签名得到的结果
证书: 原始内容C1+签名S1
在这里插入图片描述
根证书安装在操作系统中,我们认为根证书是一定正确的。 如何验证根证书可靠性?
答案:无法验证。根证书是自验证证书,CA机构是获得社会绝对认可和有绝对权威的第三方机构,这一点保证了根证书的绝对可靠。如果根证书都有问题那么整个加密体系毫无意义。

业务相关证书的生成

  1. 企业利用RSA等算法,生成一对公钥K3 / 私钥K4
  2. 公钥K3 j加 证书其他内容 组成原始证书内容C2,给到认证机构;
  3. 认证机构拿到 C2 后,利用摘要算法,生成摘要 H2
  4. 认证机构用自己的私钥K1 (这是关键点),对摘要H2 签名,得到签名S2
  5. 原始内容C2 和 签名S2 合并到一起,得到证书交给企业。

K2、K3:企业成的公钥、私钥
C2: 公钥K3+证书其他内容
H2: C2生成的摘要
S2:私钥K1对摘要H2签名得到的结果
证书: 原始内容C2+签名S2
在这里插入图片描述
区别点在于: 业务申请的证书在签名时用的私钥是CA机构的私钥这个私钥是和根证书中的公钥对应的。

数字证书的真伪验证

用根证书的公钥,可以验证其他证书的签名是否正确。如果签名正确,则证书是可信的、没有被篡改的。后续就可以使用这个被信任证书中包含的公钥,去验证收到的消息是否可信了。
>


假设甲公司要给乙公司发送一份机密的文件,那么这次传输需要确保以下几点:

1.文件内容不被泄露

  • 甲公司对文件加密(对称加密)后,将加密后的文件发送给乙公司。乙公司只有使用甲公司提供的 密钥A才可查看到文件内容。

2.要确保只有乙公司能接收

  • 为了保证密钥A只有乙公司能接受到,甲公司将 密钥A使用非对称加密算法进行二次加密,生成2个密钥,一个公钥一个私钥,公钥对外公开,而私钥甲公司自己保管 。 用公钥加密的文件只能用私钥解密,而私钥加密的文件只能用公钥解密。

所以,当甲公司使用乙公司的公钥对密钥A加密时,乙公司只有使用正确私钥才可以解密,从而保障了密钥A传输安全,进而确保了只有乙公司才能使用密钥A查看到甲公司传输的文件内容。

3.怎样保证乙公司使用的公钥就是甲公司的

  • 甲公司通过向CA机构申请并获得乙公司的公钥后,即可对密钥A进行加密,并确保确实是乙公司的公钥,从而确保只有乙公司使用其私钥才可以打开加密文件并查看内容。

    • CA (Certificate Authority) :全称证书管理机构,即数字证书的申请、签发及管理的权威机构。其主要功能为: 产生密钥对、生成数字证书、分发密钥、密钥管理等。
    • CA认证: 为电子签名相关各方提供真实可靠验证的电子认证服务。

      CA机构会为每个使用公开密钥的用户发放一个数字证书,以此来证明证书中列出的用户合法拥有证书中列出的公开密钥。同时,由CA机构提供的数字签名,会使黑客等无法伪造、篡改证书。

    • 数字证书:是由CA机构颁发的证明(CA证书),它包含了公钥、公钥拥有者名称、CA 的数字签名、有效期、授权中心名称、证书序列号等信息。我们可以通俗的理解为数字证书是个人或企业在网络上的身份证

如何验证根证书可靠性?

  • 无法验证。根证书是自验证证书,CA机构是获得社会绝对认可和有绝对权威的第三方机构,这一点保证了根证书的绝对可靠。如果根证书都有问题那么整个加密体系毫无意义。

CA证书申请的签发过程

  1. 由服务方向CA机构提交组织信息、个人信息(域名)、公钥等信息并申请CA认证

  2. CA机构收到申请后,会通过线上、线下等多种方法来验证申请人的信息是否真实

  3. 信息通过审核后,CA机构会为申请人签发认证文件证书,证书内容包括:申请人的公钥、组织信息和个人信息、CA签发机构信息、CA证书有效时间、CA证书序列号等信息的明文,同时包含一个CA机构签名

  4. 客户端(浏览器)向服务方的服务器发出请求时,服务方会返回证书文件

  5. 客户端(浏览器)会读取CA证书中相关明文信息,利用对应CA的公钥解密签名,通过一定的算法获得摘要并进行对比,如信息一致,就能确认证书的合法性,然后再验证证书的域名信息、有效期等等。

  6. 客户端(浏览器)会内置信任该 CA 证书信息,如果该CA证书不被信任,则会被判定为非法。

常用加密解密算法【RSA、AES、DES、MD5】介绍和使用

猜你喜欢

转载自blog.csdn.net/qq877728715/article/details/114699628