为了便于统一行文思路,所以提前说明本篇流程:
对称加密和非对称加密 各自的缺陷
引出 非对称加密+对称加密的综合利用
非对称加密+对称加密的综合利用的缺陷
引出数字签名技术
数字签名技术的漏洞
引出 数字签名和数字证书综合利用
在对称加密算法中,加密和解密使用的是同一把钥匙,即:使用相同的密匙对同一密码进行加密和解密;
加密:原文 + 密匙 = 密文
解密:密文 - 密匙 = 原文
用对称加密可行吗?
非对称加密有两个钥匙,及公钥(Public Key)
和私钥(Private Key)
。公钥和私钥是成对的存在,如果对原文使用公钥加密,则只能使用对应的私钥才能解密;因为加密和解密使用的不是同一把密钥,所以这种算法称之为非对称加密算法。
对称加密
非对称加密
对称加密不安全,速度快,非对称加密安全系数高,耗时,如何解决这个问题?
解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。
请看一下这个过程:
完美?还是有漏洞
的。
中间人的确无法得到浏览器生成的密钥B,这个密钥本身被公钥A加密了,只有服务器才有私钥A’解开拿到它呀!然而中间人却完全不需要拿到密钥A’就能干坏事
了。
中间人得到了密钥B。根本原因是浏览器无法确认自己收到的公钥是不是网站自己的
如何证明浏览器收到的公钥一定是该网站的公钥? ——》》 数字证书
非常生动的漫画说明
网站在使用HTTPS前,需要向“CA机构”
申请颁发一份数字证书,数字证书里有证书持有者、证书持有者的公钥等信息,服务器把证书传输给浏览器,浏览器从证书里取公钥就行了,证书就如身份证
一样,可以证明“该公钥对应该网站”。然而这里又有一个显而易见的问题了,证书本身的传输过程中,如何防止被篡改?即如何证明证书本身的真实性?
数字签名
1、制作数字签名流程
明文信息 ——》 进行hash(SHA1) ——》 得到摘要(Digest) ——》 使用私钥对摘要(Digest) 加密 ——》 明文 和 数字签名 组成 签名结果
注意,这里对摘要
进行简单说明:
所谓摘要
,其实就是某种HASH算法
。将信息明文转化为固定长度的字符,它具有如下特点:
MD5和SHA1
。为什么制作数字签名时需要hash一次?
前面我们已经说了非对称加密效率较差,证书信息一般较长,比较耗时。而hash后得到的是固定长度的信息(比如用md5算法hash后可以得到固定的128位的值),这样加密解密就会快很多。
以下图说明为例:假设有一天,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)
。
网站在使用HTTPS前,需要向“CA机构”申请颁发一份数字证书,
数字证书里有证书持有者
、证书持有者的公钥
等信息,服务器把证书传输给浏览器,浏览器从证书里取公钥就行了,证书就如身份证
一样,可以证明“该公钥对应该网站”。
Alice收信后,用CA的公钥解开数字证书,就可以拿到Bob真实的公钥了,然后就能证明“数字签名”是否真的是Bob的。
明文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