开发中的几种加密算法的使用场景

数据传输过程中的加密是程序开发中避不开的一个问题。如何更科学更合理的使用加密算法也就成了一个开发人员必须了解的知识点,本文就该问题做简单的介绍。

注意:这些算法的详细知识不属于本文的范围。本文主要是根据其特点,说明如何在开发中合理使用这些算法。

常见的加密算法:

加密算法有很多,这里只列出开发中常用的几种。

  MD5:

严格来讲这不算是一种加密算法,应该叫做信息摘要算法。也是目前开发中应用非常广的算法。MD5是一种不可逆的加密算法,无法通过密文还原成明文(注意:是算法上不能实现),对于简单的MD5加密,是可以通过一些在线工具网站解密出来。目前在开发中主要用在文件(图片、视频、文档等文件)的唯一性标识。比如我们的系统有一个需求,需要保存每一个用户上传的 word 文档,word文档的命名没有强制要求规则,这时就会发生这样一种情况,用户A 和 用户B 都上传了的一个名为 《大数据学习路径规划》的word文件。这时系统如果直接存储在同一个目录下就会造成冲突,就像 windows 里面同一个文件夹下不能有同名文件一样。这个时候要解决冲突就可以采用MD5,当然解决方式不止这一种。具体操作就是我们可以使用 md5 对文件进行一个计算得到其 hash 值,只要是两个不同的文件,该值就是唯一的,所以就可以这个hash值作为该文件的实际存储名,原名根据需求保存即可。

   RSA和AES

 RSA是一种非对称的加密算法(加密【公钥】和解密【私钥】的 key 是不同的),AES是对称的加密算法(加密和解密的 key 是相同的),两者的详细知识不属于本文范围。

分析这两种算法的特点可以知道,单纯的使用 AES 的来加密两者传输中的数据的时候首先要让双方要知道秘钥是什么,可问题就是这个秘钥的传输是一个问题,直接通过网络传输是极其不安全的。因为网络一旦被监听,这个秘钥就没有存在的意义了,而监听一个网络,难度并不是很大,所以我们不能直接使用AES。

再来看RSA,由于RSA是非对称的加密算法,私钥用来解密,公钥用来加密,公钥之所以带“”,也是因为其本身就是就需要对外公开的,并不需要保密。这样对于通信双方来说,建立链接之后的第一件事就是双方分发自己的公钥给对方,一端数据传输给对方的时候,先使用接收方发过来的公钥对数据进行加密后再发送,之后接收方会使用自己的私钥解密数据得到明文,然后再使用对方的公钥加密敏感的响应数据,之后再发送给对方,对方拿自己的私钥解密。这样就完成了数据的加密传输通信。我们分析这个过程可以知道,整个传输过程中,只是对外暴露了公钥,这时即使黑客拿到了公钥,但是也无法解密传输过程中的数据,因为只有私钥才能解密数据。这样看起来就完美的解决了双方的加密通信问题。但是有这种加密算法相比 AES 比较耗资源,对于一个访问量比较大的web服务来说,是不推荐的。

RSA和AES的结合:

通过上面的分析,我们结合两者的优点,创建新的使用模式。先来张图做一个简单介绍

开发中的几种加密算法的使用场景

      从上图可以看出,当客户端要与服务器端通信的时候,客户端先使用 RSA 算法生成自己的公钥和私钥,然后把公钥以明文的方式发送给服务器,服务器拿到公钥,并使用从客户端接收到的公钥对 AES 的秘钥进行加密然后返回给客户端。客户端接收到加密后的 AES 秘钥后就可以直接使用自己的私钥解密 AES 的秘钥,从而得到 AES 秘钥明文。之后两者的通信就可以使用 AES来实现敏感信息的加密了。这个操作就即解决了 AES 秘钥的传输问题,又解决了 RSA 算法效率不高的问题。