对称加密、非对称加密以及数字签名和数字证书
0、本文流程
为了便于统一行文思路,所以提前说明本篇流程:
- 1、
对称加密和非对称加密 各自的缺陷
引出非对称加密+对称加密的综合利用
- 2、
非对称加密+对称加密的综合利用的缺陷
引出数字签名技术
- 3、
数字签名技术的漏洞
引出数字签名和数字证书综合利用
1、对称加密、非对称加密
1.1、对称加密(Symmetric Cryptography)
1.1.1、定义
在对称加密算法中,加密和解密使用的是同一把钥匙,即:使用相同的密匙对同一密码进行加密和解密;
- 发送方使用密钥将明文数据加密成密文,然后发送出去,接收方收到密文后,使用同一个密钥将密文解密成明文读取。
- 常见的对称加密算法有DES、3DES、AES、Blowfish、IDEA、RC5、RC6。
加密:原文 + 密匙 = 密文
解密:密文 - 密匙 = 原文
1.1.2、特征
- 加密计算量小、速度块,适合对大量数据进行加密的场景。
- 对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。
用对称加密可行吗?
- 1、密钥传输问题:由于对称加密的加密和解密使用的是同一个密钥,所以对称加密的安全性就不仅仅取决于加密算法本身的强度,更取决于密钥是否被安全的保管,因此加密者如何把密钥安全的传递到解密者手里,就成了对称加密面临的关键问题。
- 2、密钥管理问题:我们在加密用户的信息时,不可能所有用户都用同一个密钥加密解密吧,这样的话,一旦密钥泄漏,就相当于泄露了所有用户的信息,因此需要为每一个用户单独的生成一个密钥并且管理,这样密钥管理的代价也会非常大。
1.2、非对称加密(Asymmetric Cryptography)
1.2.1、定义
非对称加密有两个钥匙,及公钥(Public Key)
和私钥(Private Key)
。公钥和私钥是成对的存在,如果对原文使用公钥加密,则只能使用对应的私钥才能解密;因为加密和解密使用的不是同一把密钥,所以这种算法称之为非对称加密算法。
- 比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人–银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。
- 非对称加密算法的密匙是通过一系列算法获取到的一长串随机数,通常随机数的长度越长,加密信息越安全。
- 通过私钥经过一系列算法是可以推导出公钥的,也就是说,公钥是基于私钥而存在的。但是无法通过公钥反向推倒出私钥,这个过程的单向的。
1.2.2、特征
- 优点:安全,即使密文被拦截、公钥被获取,但是无法获取到私钥,也就无法破译密文。作为接收方,务必要保管好自己的密钥。
- 缺点:加密算法及其复杂,安全性依赖算法与密钥,而且加密和解密效率很低。
1.3、对称加密和非对称加密区别
对称加密
- 加密密码和解密密码是相同的密钥
非对称加密
- 加密密码和解密密码不同
- 加密和解密算法都是公开的,加密密钥也是公开的,解密密钥是保密的
- 公钥和私钥是配对关系,公钥加密就用私钥解密
1.4、非对称加密+对称加密的综合利用
对称加密不安全,速度快,非对称加密安全系数高,耗时,如何解决这个问题?
解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。
请看一下这个过程:
- 1、某网站拥有用于非对称加密的公钥A、私钥A’。
- 2、浏览器像网站服务器请求,服务器把公钥A明文给传输浏览器。
- 3、浏览器随机生成一个用于对称加密的密钥X,用公钥A加密后传给服务器。
- 4、服务器拿到后用私钥A’解密得到密钥X。
- 5、这样双方就都拥有密钥X了,且别人无法知道它。之后双方所有数据都用密钥X加密解密。
完美?还是有漏洞
的。
1.5、中间人攻击
中间人的确无法得到浏览器生成的密钥B,这个密钥本身被公钥A加密了,只有服务器才有私钥A’解开拿到它呀!然而中间人却完全不需要拿到密钥A’就能干坏事
了。
- 1、某网站拥有用于非对称加密的公钥A、私钥A’。
- 2、浏览器向网站服务器请求,服务器把公钥A明文给传输浏览器。
- 3、中间人劫持到公钥A,保存下来,把数据包中的公钥A替换成自己伪造的公钥B(它当然也拥有公钥B对应的私钥B’)。
- 4、浏览器随机生成一个用于对称加密的密钥X,用公钥B(浏览器不知道公钥被替换了)加密后传给服务器。
- 5、中间人劫持后用私钥B’解密得到密钥X,再用公钥A加密后传给服务器。
- 6、服务器拿到后用私钥A’解密得到密钥X。
- 总结:
中间人得到了密钥B。根本原因是浏览器无法确认自己收到的公钥是不是网站自己的
如何证明浏览器收到的公钥一定是该网站的公钥? ——》》 数字证书
2、数字签名和数字证书
2.1、数字签名(Digital Signature)
2.1.1、定义
网站在使用HTTPS前,需要向“CA机构”
申请颁发一份数字证书,数字证书里有证书持有者、证书持有者的公钥等信息,服务器把证书传输给浏览器,浏览器从证书里取公钥就行了,证书就如身份证
一样,可以证明“该公钥对应该网站”。然而这里又有一个显而易见的问题了,证书本身的传输过程中,如何防止被篡改?即如何证明证书本身的真实性?
- 我们把证书内容生成一份“签名”,比对证书内容和签名是否一致就能察觉是否被篡改。这种技术就叫
数字签名
1、制作数字签名流程
明文信息 ——》 进行hash(SHA1) ——》 得到摘要(Digest) ——》 使用私钥对摘要(Digest) 加密 ——》 明文 和 数字签名 组成 签名结果
注意,这里对摘要
进行简单说明:
所谓摘要
,其实就是某种HASH算法
。将信息明文转化为固定长度的字符,它具有如下特点:
- ①无论输入的消息有多长,计算出来的消息摘要的长度总是固定的;
- ②用相同的摘要算法对相同的消息求两次摘要,其结果必然相同;
- ③一般地,只要输入的消息不同,对其进行摘要以后产生的摘要消息也几乎不可能相同;
- ④消息摘要函数是单向函数,即只能进行正向的信息摘要,而无法从摘要中恢复出任何的消息;
- ⑤好的摘要算法,没有人能从中找到“碰撞”,虽然“碰撞”是肯定存在的。即对于给定的一个摘要,不可能找到一条信息使其摘要正好是给定的。或者说,无法找到两条消息,是它们的摘要相同。
- 目前主要的摘要算法有
MD5和SHA1
。
为什么制作数字签名时需要hash一次?
前面我们已经说了非对称加密效率较差,证书信息一般较长,比较耗时。而hash后得到的是固定长度的信息(比如用md5算法hash后可以得到固定的128位的值),这样加密解密就会快很多。
2.1.2、图解说明
以下图说明为例:假设有一天,Alice收到了一份署名为Bob的文件。Alice希望能够确认这份文件一定是来自Bob;另外Alice希望能够确信,这份文件在传输过程中并没有被它人篡改。那么基于非对称密钥算法我们应该怎么做?
1、数字签名的制作过程:
① Bob将原始的信息(明文
)进行一次信息摘要算法(hash
),得到原始信息的摘要
;
② Bob使用自己的私钥
,对该摘要值进行加密。得到信息摘要的密文(数字签名
);
③ Bob将明文
和数字签名
一起发送给Alice。
④ 一般的,我们将原始文件(明文
)和数字签名 称作Bob对原始文件的签名结果。
2、验证过程
① 当Alice接收到Bob传输的信息(原始文件,信息摘要密文)后,使用Bob的公钥
将摘要密文解密,得到摘要
;
② 对明文
使用信息摘要算法(hash
),获取摘要
;
③ Alice比较解密后的摘要信息和取得的摘要信息。如果相同,则可以证明文件一定由Bob发送,并且中途并没有经过任何篡改。一般将这个过程称作验签
。
问题发现:
复杂的情况出现了。有人想欺骗Alice,他偷偷使用了Alice的电脑,用自己的公钥换走了Bob的公钥
。此时,Alice实际拥有的是骗子的公钥
,但是还以为这是Bob的公钥
。因此,骗子就可以冒充Bob,用自己的私钥做成“数字签名”,写信给Alice,让Alice用假的Bob公钥进行解密。
Alice感觉不对,发现自己无法确定公钥是否真的属于Bob。她想到了一个办法,要求Bob去找“证书中心”(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对Bob的公钥和一些相关信息一起加密,生成“数字证书”(Digital Certificate)
。
2.1.2、作用
- 确认核实发送者
- 保证报文的完整性
- 一般用于验证数字证书
2.2、数字证书(Digital Certificate)
2.2.1、定义
网站在使用HTTPS前,需要向“CA机构”申请颁发一份数字证书,
数字证书里有证书持有者
、证书持有者的公钥
等信息,服务器把证书传输给浏览器,浏览器从证书里取公钥就行了,证书就如身份证
一样,可以证明“该公钥对应该网站”。
Alice收信后,用CA的公钥解开数字证书,就可以拿到Bob真实的公钥了,然后就能证明“数字签名”是否真的是Bob的。
2.2.2、数字证书验证过程(和2.1.2节类似)
- 拿到证书,得到
明文T
,数字签名S
。 - 用
CA机构的公钥
对S解密,得到S’。(由于是浏览器信任的机构,浏览器保有它的公钥,操作系统、浏览器本身会预装一些它们信任的根证书,如果其中有该CA机构的根证书,那就可以拿到它对应的可信公钥) - 用证书里说明的
hash算法
对明文T
进行hash得到T’。 - 比较
S’是否等于T’
,等于则表明证书可信。
参考
1、https://zhuanlan.zhihu.com/p/49494990
2、https://blog.csdn.net/hmxz2nn/article/details/91394256
3、https://zhuanlan.zhihu.com/p/43789231
4、https://www.jianshu.com/p/4932cb1499bf
5、https://www.cnblogs.com/MicroHeart/p/9057189.html
6、http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html