33

聊聊对称加密与非对称加密

 3 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzUzMzE4MDY0Nw%3D%3D&%3Bmid=2247484076&%3Bidx=1&%3Bsn=7cd1f877cb05abb9710a7be8db165743
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

原创:花括号MC(微信公众号:huakuohao-mc)。关注JAVA基础编程及大数据,注重经验分享及个人成长。

目前大家常说的信息加密技术就两种, 对称加密非对称加密

对称加密

所谓的对称加密就是加密和解密用同一份密钥。对称加密的好处就是加密速度快,但是缺点也很明显,一定要保存好这份密钥,如果密钥丢失,就会带来很大的安全风险。而且如果与服务端进行通信的客户端比较多的话,服务端要管理很多份不同的密钥。

非对称加密

为了解决对称加密的缺点,人们提出了非对称加密,非对称加密技术也是目前应用最广泛的加密技术。所谓的非对称加密就是生成一对密钥,分为公钥和私钥。私钥自己保存,公钥发布出去。用私钥加密的信息只能用公钥解密,用公钥加密的信息也只能用私钥解密。

举个例子

假设你的好朋友铁蛋,经常网购。购物网站为了保证信息安全传输,决定生成一对密钥,私钥自己保存,公钥发给铁蛋。铁蛋发给购物网站的信息都是用公钥加密的信息,购物网站收到后,用自己的私钥进行解密。这样即使传输途中,信息被截获,也没办法破解,因为没有私钥。

amMrAj3.png!web

有个漏洞

这个时候有个黑客,做了一个假的购物网站,页面和真的网站一摸一样,连网址都很相似。同时也生成了一对密钥,最重要的是黑客偷偷的把铁蛋电脑里真购物网站的公钥给替换成了假购物网站的公钥。

当铁蛋打开假的网址进行购物操作时,会用假的公钥进行加密然后把消息发给假的网站,整个通信过程,铁蛋都没有发现自己被骗。

jYrUbiF.png!web

铁蛋之所以被骗,是因为他不知道电脑里的真公钥已经被换成假的了。为了解决这个问题,出现一个认证机构,这个机构会对网站的公钥进行加密签名并形成一个证书,这个证书就是大家常说的 CA 证书,这个机构就是 CA

只要铁蛋电脑里面安装的是经过 CA 认证的证书,在访问的时候,浏览器就会显示出一把小锁,提示可以安全访问,如果没有经过认证,浏览器就会提示铁蛋有风险。

铁蛋经常在多个网站购物,难道需要每个网站都保存一份证书?其实不用这样,我们的电脑里面一般都有 CA 的根证书,只要有了这个证书,所有经过 CA 认证过的网站就都是安全的。

没错,我上面介绍的就是 HTTPS 的工作原理,这也是非对称加密技术的典型用。

双向认证

非对称加密还有一个应用场景就是双向认证。所谓的双向认证就是不仅服务端要验证客户端的身份,客户端也要验证服务端的身份。说白了就是客户端和服务端各自生成一个密钥对,私钥自己保存,公钥发给对方。这种情况一般用在系统与系统的对接上。

为什么需要双向认证

假设 C 系统要访问 S 系统的服务, S 系统对外提供的数据安全级别比较高,只有受信系统才能访问。假设目前只允许 C 系统访问。

S 系统为了保证信息安全传输,决定生成一对密钥,私钥自己保存,公钥发给 C 系统。 C 系统访问 S 的时候,会用 S 的公钥将消息进行加密发给系统 SS 用私钥进行解密。

如果这个时候窃密者 B 系统偷偷拿到的 S 提供给 C 的公钥,然后 BS 的公钥加密消息之后发送给系统 S ,获取相应的数据,那么 S 是没办法判断出请求的消息是来自 C 还是来自窃密者 B

如何保证消息来自于受信系统 C 呢?经过协商, C 系统也生成一对密钥,私钥自己保存,公钥发给系统 S

CS 发送请求的时候, C 先将要发的消息,假设为 M ,进行一次 Hash 运算,得到一个固定长度的 Hash 值,这个值一般称为 数字摘要 。然后 C 用自己的私钥对这个数字摘要进行加密,加密后的值称为 数字签名 ,其实跟现实中我们在文件中进行手写签名是一个意思。

C 系统将数字签名和要发送的消息 M ,一起用 S 的公钥做一次加密之后发送给系统 S

S 收到消息之后,先用自己的私钥对消息进行解密,解密之后,得到 C 的数字签名和消息 M 。这个时候关键的一步来了,就是验签,验证消息是否是 C 发来的。

首先 SC 的公钥对签名进行解密操作,解密完成后会得到一个摘要值,我们称之为 D 。能解开就证明消息是 C 发来的。 S 还会用和 C 一样的 Hash 算法对消息 M 进行 Hash 运算,这样将会得到一个摘要值,我们称之为 D‘ ,如果 DD’ 相同就证明消息没有被篡改过。

总结

上面的双向认证过程也是有漏洞的,只不过相比于单项认证,降低了被破译的风险而已。注意,世界上不存在绝对安全的系统,即便是现在逐渐流行起来的生物识别系统。我们所做的各种安全措施都只是在降低系统被破解的风险而已。

就像家里的防盗门,只防君子不防小人。

推荐阅读

1. Java并发编程那些事儿(十)——最后的总结

2. 一篇小文带你走进RabbitMQ的世界

3. Awk这件上古神兵你会用了吗

4. 手把手教你搭建一套ELK日志搜索运维平台

·END·

花括号MC

Java·大数据·个人成长

rAryeqV.jpg!web

微信号:huakuohao-mc

点一下你会更好看耶

7J7VZvy.gif


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK