信息的传输过程中,如何保证内容不被篡改,即信息的完整性?结合前面学到的加密知识,我们可以用单向加密算法。
比如,用 md5 加密算法,小明给小花发的内容用 md5 作一次加密运算,会生成一个唯一的字符串,我们把这个字符串起个名,叫做“摘要”。
小明会把单向加密算法 md5, 以及md5运算的结果摘要,一块发给小花。小花收到内容后,用md5对内容进行加密算法,生成新的摘要。
小花将新的摘要和原先的摘要进行对比,如果相等,说明没有被人篡改过。如果不相等,说明内容被别人修改过了。
小花,看见内容后,用md5对摘要二次运算,发现仍然和原来的一致。不由得感慨,小明这个理工男非常不懂浪漫,也不邀请她一起看个电影。
这个时候,老王又出现了。
如下图表示:
这次,老王却弄巧成拙,成全了小明和小花成功约会看电影。
但是,话说回来,使用单向加密算法生成摘要的方式,是不能保证内容的安全完整性的。
如何才能保证信件的完整性,不被人篡改呢?
答案是,签名✒️。
通过前面学习,我们知道非对称加密,有2个作用,其中一个就是身份认证。
还是上面的例子我, 我们改一下:
此时,这个过程就是安全的了。老王截取了信件修改内容,可以用md5算出新的摘要。但老王是修改不了签名,因为签名是小明私钥加密的。就算老王能用公钥解密,也没法生成新的签名,因为只有小明有私钥。小花用小明的公钥对签名解密,假如老王用私钥对摘要加密生成签名,小花用小明的公钥也是解密不了的。
概念的总结:
摘要:单向加密算法对内容加密出来的字符串,就叫做摘要。
签名:小明用私钥对摘要进行加密出来签字串,就叫做签名。
验签:用小明的公钥对签名进行解密出来的摘要和原来的对比,就叫做验签。
数字证书是由CA机构颁发的,用来解决公钥传输问题的。
小明如果想要有一个数字证书,就要向CA机构申请。CA机构会给小明颁发一张数字证书。小明的证书,里面包含以下内容:
公钥:小明的公钥;
颁发者:CA(证书认证机构);
有效期:证书的使用期限;
摘要算法:指定的摘要算法,用来计算证书的摘要;
指纹:也就是证书的摘要,保证证书的完整性;
签名算法:用于生成签名,确保证书是由CA签发;
序列号:证书的唯一标识;
CA 将小明的公钥,颁发者,有效期,摘要算法 ,哈希算法写入证书;
CA 根据证书中的指定的哈希算法计算出整个证书的摘要,即 digest(摘要);
CA 用私钥对摘要进行加密生成签名,即 signature(签名);
CA 把摘要、签名、证书的基本信息,一起发布就生产了小明的证书。
数字证书就是解决公钥安全传输的,同时数字证书就是一个文件。
小明有了自己的证书了,就不用公开传输公钥了,只需要传输证书就行了。
小明❤️小花想要安全的通信。小明先要把数字证书发送给小花。但是,担心证书被老王掉包,小花需要对证书进行验证。
验证数字证书是CA频发的,需要CA的数字证书(因为里面有CA的公钥)。通过从上面的描述,我们知道了,需要一个数字证书,就向CA申请颁发。
因为,CA机构自己的数字证书,也是自己给自己颁发的,那么我们从哪里获取呢?
如果从网上,或者从其它服务器下载,又有可能会被掉包,又不安全了。从网上下载或者从其它服务器下载数字证书,都不安全的,那么怎么样才是安全的呢?
答案就在你电脑里的操作系统里面,它内置了非常多的CA机构的数字证书了。也就说,只要你安装了操作系统,不管是windows、 linux、 mac、android都有CA机构的数字证书。
这些都是可以相信的,是真的CA机构的数字证书,不会有假。(盗版除外)
其实 https 过程不知道,也没啥关系,也不影响你写代码,但是那些面试官就死爱问这块,好像他们能搞懂这个过程很了不起似的,你问点设计模式它不香嘛?
话说回来,接下来,我们就要对数字证书进行辨别真伪了。
欢迎关注,持续更新。