目前大家常说的信息加密技术就两种,对称加密和非对称加密。
对称加密
所谓的对称加密就是加密和解密用同一份密钥。对称加密的好处就是加密速度快,但是缺点也很明显,一定要保存好这份密钥,如果密钥丢失,就会带来很大的安全风险。而且如果与服务端进行通信的客户端比较多的话,服务端要管理很多份不同的密钥。
非对称加密
为了解决对称加密的缺点,人们提出了非对称加密,非对称加密技术也是目前应用最广泛的加密技术。所谓的非对称加密就是生成一对密钥,分为公钥和私钥。私钥自己保存,公钥发布出去。用私钥加密的信息只能用公钥解密,用公钥加密的信息也只能用私钥解密。
举个例子
假设你的好朋友铁蛋,经常网购。购物网站为了保证信息安全传输,决定生成一对密钥,私钥自己保存,公钥发给铁蛋。铁蛋发给购物网站的信息都是用公钥加密的信息,购物网站收到后,用自己的私钥进行解密。这样即使传输途中,信息被截获,也没办法破解,因为没有私钥。
有个漏洞
这个时候有个黑客,做了一个假的购物网站,页面和真的网站一摸一样,连网址都很相似。同时也生成了一对密钥,最重要的是黑客偷偷的把铁蛋电脑里真购物网站的公钥给替换成了假购物网站的公钥。
当铁蛋打开假的网址进行购物操作时,会用假的公钥进行加密然后把消息发给假的网站,整个通信过程,铁蛋都没有发现自己被骗。
铁蛋之所以被骗,是因为他不知道电脑里的真公钥已经被换成假的了。为了解决这个问题,出现一个认证机构,这个机构会对网站的公钥进行加密签名并形成一个证书,这个证书就是大家常说的CA
证书,这个机构就是CA
。
只要铁蛋电脑里面安装的是经过CA
认证的证书,在访问的时候,浏览器就会显示出一把小锁,提示可以安全访问,如果没有经过认证,浏览器就会提示铁蛋有风险。
铁蛋经常在多个网站购物,难道需要每个网站都保存一份证书?其实不用这样,我们的电脑里面一般都有CA
的根证书,只要有了这个证书,所有经过CA
认证过的网站就都是安全的。
没错,我上面介绍的就是HTTPS
的工作原理,这也是非对称加密技术的典型应用。
双向认证
非对称加密还有一个应用场景就是双向认证。所谓的双向认证就是不仅服务端要验证客户端的身份,客户端也要验证服务端的身份。说白了就是客户端和服务端各自生成一个密钥对,私钥自己保存,公钥发给对方。这种情况一般用在系统与系统的对接上。
为什么需要双向认证
假设C
系统要访问S
系统的服务,S
系统对外提供的数据安全级别比较高,只有受信系统才能访问。假设目前只允许C
系统访问。
S
系统为了保证信息安全传输,决定生成一对密钥,私钥自己保存,公钥发给C
系统。C
系统访问S
的时候,会用S
的公钥将消息进行加密发给系统S
,S
用私钥进行解密。
如果这个时候窃密者B
系统偷偷拿到的S
提供给C
的公钥,然后B
用S
的公钥加密消息之后发送给系统S
,获取相应的数据,那么S
是没办法判断出请求的消息是来自C
还是来自窃密者B
。
如何保证消息来自于受信系统C
呢?经过协商,C
系统也生成一对密钥,私钥自己保存,公钥发给系统S
。
当C
向S
发送请求的时候,C
先将要发的消息,假设为M
,进行一次Hash
运算,得到一个固定长度的Hash
值,这个值一般称为数字摘要。然后C
用自己的私钥对这个数字摘要进行加密,加密后的值称为数字签名,其实跟现实中我们在文件中进行手写签名是一个意思。
C
系统将数字签名和要发送的消息M
,一起用S
的公钥做一次加密之后发送给系统S
。
S
收到消息之后,先用自己的私钥对消息进行解密,解密之后,得到C
的数字签名和消息M
。这个时候关键的一步来了,就是验签,验证消息是否是C
发来的。
首先S
用C
的公钥对签名进行解密操作,解密完成后会得到一个摘要值,我们称之为D
。能解开就证明消息是C
发来的。S
还会用和C
一样的Hash
算法对消息M
进行Hash
运算,这样将会得到一个摘要值,我们称之为D‘
,如果D
和D’
相同就证明消息没有被篡改过。
总结
上面的双向认证过程也是有漏洞的,只不过相比于单项认证,降低了被破译的风险而已。注意,世界上不存在绝对安全的系统,即便是现在逐渐流行起来的生物识别系统。我们所做的各种安全措施都只是在降低系统被破解的风险而已。
就像家里的防盗门,只能防君子不能防小人。
推荐阅读
1. Java并发编程那些事儿(十)——最后的总结
2. 一篇小文带你走进RabbitMQ的世界
3. Awk这件上古神兵你会用了吗
4. 手把手教你搭建一套ELK日志搜索运维平台