问题:我们都知道RSA加密是安全的,但是我们在使用的使用,怎么使用才能保证数据的安全传输呢?
一、原则:公钥机密、私钥解密、私钥签名、公钥验签
公钥私钥都可以加密和解密数据,但是因为持有公钥和私钥的人不同,在具体的使用场景中,公私钥的使用方式,也是有明确规定的。
公钥加密/私钥解密: 因为公钥是暴露在外的,私钥确实某个人单独持有的,当使用私钥加密数据,所有持有公钥的人,都可以解密数据,那么数据就泄露了,所以正确的方式是公钥加密、私钥解密。通讯方式是两个人A和B分别持有 自己的私钥和对方的公钥,就可以进行数据的安全安全传输了
私钥签名/公钥验签: 上面说了公钥加密、私钥解密能保证数据的安全不泄密,那么私钥加密、公钥解密的作用又是什么的?当使用私钥加密数据以后,因为公钥是暴露在外的,所以任何持有公钥的人都可以解密数据,所以私钥解密不是用来做数据加密的,而是做身份验证的,因为只有持有对应公钥的人才可以解密对应私钥的数据,所以私钥是用来做签名,公钥验签确认身份的。
二、数据摘要
什么是数据摘要,什么数据摘要的作用是什么?
假设如下场景:A给B传输一段不需要加密的数据,如何保证数据的完整性呢?这里就需要用到摘要算法
摘要算法的原理:签名算法的原理其实就是单项映射,但是运算结果是不可逆的,并且只要对原文有任何改动,经过摘要算法的得到的结果就会大为不同
好的摘要算法要具备一下特点
不可逆:只有算法、没有密钥、只能加密、不能解密
难题友好性:想要破解只能暴力枚举
发散性:只要原文有任一改动,结果就会剧烈变化
扛碰撞性:原文不同不同,计算摘要的结果也要不同
具体操作:只要在传输数据的时候将经过摘要算法得到的数据也一并发送,并且告知是采用的哪种摘要算法,另一方接收到数据以后,对原文进行相同类型的摘要算法的到结果与接收到的摘要算法的值进行比较,完全相同则证明数据是完整没有别篡改过的
三、签名
设想如下场景:A给B通过摘要算法传输一段不需要加密的数据,如果被黑客拦截并且替换成自己的明文和明文按照一定摘要算法得到的摘要,发送给B,那么B是不知道信息已经被篡改了的,那么如何保证B接收到的数据是A发送的呢?那就是用A的私钥将摘要进行加密,当B收到数据以后,使用A的公钥进行解密得到摘要,将原文进行摘要算法得到的摘要与解密的到的摘要进行比对,一致则证明数据是A发的且没有被篡改过。
过程:
四、数字证书
假设如下场景,A要和B通信,但是呢,C拿着自己的公钥谎称自己是A,然后和B通信,这时候B拿到的其实是C的公钥,却认为是在和A通信。这就是典型的钓鱼网站。
那么该如何解决这个问题呢?如何保证A的公钥就是来自与A呢(公钥解密验签,拿着谁的公钥就认为在和谁通信),这就需要一个唯一的权威机构,证明A的公钥是属于A的,这个机构就是CA。用户通过填写自己的信息(包括公司名称,公钥等),由CA审核通过下发数字证书。
数字证书包含的内容:
公钥:申请证书的人上传的公钥
所有者:证书申请人
颁发者:CA
有效期:证书有效期
摘要算法类型:将公钥进行摘要使用的摘要算法的类型
指纹:生成的摘要
证书签名:使用CA的私钥进行签名以后得到的签名
证书唯一编号:证书系列号
加解密的流程:
1)加密
用户填写公钥申请证书-》CA根据具体的摘要算法计算公钥的摘要-》CA使用自己的私钥将摘要进行签名得到公钥的签名-》CA将公钥原文,摘要,签名等拼装好证书下发给用户。用户将信息进行摘要,-》将摘要进行签名-》在将原文,签名,证书一块发给B用户。
2)解密
首先得到证书,使用CA的公钥验签得到证书的摘要,再将原文用规定的摘要算法计算得到摘要,将得到的两个摘要进行比较,相同的话,则证明证书中的公钥是真的来源自A
再用证书中得到的A的公钥对,数据中的签名进行验签得到数据的摘要,和使用原文的数据进行摘要算法得到的摘要比较,相同则证明确实是A发送的数据且数据未被篡改。