文章目录
前言
结合我之前写的【Java基础】加密与安全基础 、【JavaWeb】浅谈接口安全设计指南(含源码) 【JavaWeb】如何优雅的实现第三方开放api接口签名(有状态/无状态)可以在看本文章时更加熟悉 “加密以及安全”的基础概念
相关术语
- 加密:encryption
- 解密:decryption
- 秘钥:secret key (公钥:public key 私钥:private key)
- 数字签名:digital signature
- 数字证书:digital certificate
- 摘要:digest
一.消息摘要(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.举例说明
-
鲍勃
有两把钥匙,一把是公钥,另一把是私钥。
-
鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。
-
苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。
-
鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。
-
鲍勃给苏珊回信,决定采用
"数字签名"
。他写完后先用Hash函数,生成信件的摘要(digest)
。
-
然后,鲍勃
使用私钥,对这个摘要加密,生成"数字签名(signature)"
。
-
鲍勃将这个
签名(signature)
,附在信件下面,一起发给苏珊。
-
苏珊收信后,取下
签名(signature)
,用鲍勃给的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。
-
苏珊再对信件本身使用Hash函数,将得到的
摘要(digest)
,与上一步使用公钥解密得到的摘要进行对比
。如果两者一致,就证明这封信未被修改过。
-
复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成"
数字签名(signature)
",写信给苏珊,让苏珊用假的鲍勃公钥进行解密。
-
后来,苏珊感觉不对劲,发现自己无法确定公钥是否真的属于鲍勃。她想到了一个办法,要求鲍勃去找
"证书中心"(certificate authority,简称CA)
,为公钥做认证。证书中心用自己的私钥,对鲍勃的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)
。
-
鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名(signature)的同时,再附上数字证书就行了。
-
苏珊收信后,
用CA的公钥解开数字证书
,就可以拿到鲍勃真实的公钥
了,然后就能证明"数字签名"是否真的是鲍勃签的
。
3.签名和验证的流程
请求发送者
持有 私钥 和 加密算法
,称为信源
,并用私钥和加密算法对明文数据进行加密
,得到密文数据
,称为签体sign
接着把明文数据
和签体(密文数据)
同时发给请求接收者请求接收者
- 收到请求后,先取出
签体(密文数据)
,用公钥对密文解密,得到一份明文数据
,再将解密后的明文数据和收到的明文数据做对比,如果相同则数据完整且可信
。
即使他人截获并篡改了「明文数据」,由于「私钥」是保密的,篡改者也无法生成正确的「签体」。所以签名能保证消息的准确性
。
但在单独使用非对称加密的数字签名方案时,要对所有明文消息进行加密,效率很低。怎么提高效率呢?
将摘要算法和非对称加密结合使用
。如何签名:先用
摘要算法计算明文数据的摘要值
,再对这个摘要值用私钥加密
。这样就能较快速地得到了原始信息的签名
;
如何验证:先用相同的摘要算法计算原始信息的摘要值,再用公钥对签名解密
,得到收到的摘要值,最后对比这两个摘要值判断是否相等。如果不相等说明数据不可信。
三.数字证书(Digital Certificate)
1.概述
公钥是公开
的并且可以自行导入到电脑,比如C
偷偷在B的电脑
用自己公钥C
替换了A的公钥,然后用自己的私钥C
给 B 发送Email,这时B收到邮件其实是被C冒充的但是他无法察觉。 因此如果公钥本身都被篡改了,这个签名方案就不正确了。所以需要有某种方式确保公钥的正确性
,这就是 "数字证书"
。
- 因为任何人都可以生成自己的(公钥,私钥)对,所以为了防止有人散布伪造的公钥骗取信任,就
需要一个可靠的第三方机构来生成经过认证的(公钥,私钥)对
。目前,世界上最主要的数字服务认证商
是位于美国加州的Verisign公司,它的主要业务就是分发RSA数字证书
。
数字证书作用: 确保数据接收者的公钥是没有被篡改过的。
2.举例说明
下面,我们看一个应用"数字证书"的实例:https协议。这个协议主要用于网页加密。
- 首先,客户端向服务器发出加密请求。
-
服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端
-
客户端
(浏览器)
的"证书管理器
",有"受信任的根证书颁发机构
"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。
谷歌浏览器
-
如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。
-
如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。
- 如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。
3.数字证书验证流程
数字证书通常包含以下内容:
- 证书所有人的公钥;
- 证书发行者对证书的数字签名;
- 证书所用的签名算法;
- 证书发布机构、有效期、所有者的信息等其他信息。
数字证书的验证过程需要用到
CA根证书
和业务相关证书
,根证书 是预装在操作系统中的。
CA根证书的生成
- 认证机构利用RSA等算法,生成一对
公钥K1 / 私钥K2
- 将
公钥K1
和 证书发布机构、有效期等信息组成一份原始的证书内容,设为 C1 - 利用某种摘要算法,计算原始内容 C1 的生成
摘要H1
- 用第一步生成的
私钥K2
,对摘要H1签名,得到签名S1
- 将
原始内容C1 和 签名S1
合在一起,就得到了 证书。
K1、K2:认证机构生成的公钥、私钥
C1: 公钥K1+证书发布机构、有效期等信息组成的内容
H1: C1 生成的摘要
S1:私钥K2对摘要H1签名得到的结果
证书: 原始内容C1+签名S1
根证书安装在操作系统中,我们认为根证书是一定正确的。
如何验证根证书可靠性?
答案:无法验证。根证书是自验证证书,CA机构是获得社会绝对认可和有绝对权威的第三方机构,这一点保证了根证书的绝对可靠。如果根证书都有问题那么整个加密体系毫无意义。
业务相关证书的生成
- 企业利用RSA等算法,生成一对
公钥K3 / 私钥K4
; - 将
公钥K3
j加 证书其他内容 组成原始证书内容C2,给到认证机构; - 认证机构拿到 C2 后,利用摘要算法,生成
摘要 H2
- 认证机构用自己的
私钥K1 (这是关键点)
,对摘要H2 签名
,得到签名S2
- 将
原始内容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 (Certificate Authority) :全称
如何验证根证书可靠性?
- 无法验证。根证书是自验证证书,CA机构是获得社会绝对认可和有绝对权威的第三方机构,这一点保证了根证书的绝对可靠。如果根证书都有问题那么整个加密体系毫无意义。
CA证书申请的签发过程
-
由服务方向CA机构提交组织信息、个人信息(域名)、公钥等信息并申请CA认证
-
CA机构收到申请后,会通过线上、线下等多种方法来验证申请人的信息是否真实
-
信息通过审核后,CA机构会为申请人签发认证文件证书,证书内容包括:申请人的公钥、组织信息和个人信息、CA签发机构信息、CA证书有效时间、CA证书序列号等信息的明文,同时包含一个CA机构签名
-
客户端(浏览器)向服务方的服务器发出请求时,服务方会返回证书文件
-
客户端(浏览器)会读取CA证书中相关明文信息,利用对应CA的公钥解密签名,通过一定的算法获得摘要并进行对比,如信息一致,就能确认证书的合法性,然后再验证证书的域名信息、有效期等等。
-
客户端(浏览器)会内置信任该 CA 证书信息,如果该CA证书不被信任,则会被判定为非法。