固定链接 云应用产生数据加密传输至业务系统的一种跨语言实现

云应用产生数据加密传输至业务系统的一种跨语言实现

云应用产生数据加密传输至业务系统的一种跨语言实现

业务开展过程中,系统通常会产生很多数据,这些数据可能分布在不同的机器上,甚至可能分布于不同的网络环境中;尤其是后者,不同网络之间数据如何安全传输?如果不同网络环境中的系统又是使用不同语言开发呢,例如 Python \ Java ?

我们考虑一个具体场景:云主机上部署爬虫爬取数据,专属网上部署业务系统,爬虫爬取的数据需要回传至业务系统。云主机多为 Linux 一般自带 Python,且 Python 处理文本方便快捷,我们使用 Python 编写爬虫;业务系统通常逻辑复杂数据量大,我们使用 Java 开发,业务系统提供公网域名及接口 ( HTTP 形式,HTTPS 更安全 ) 供数据回传使用。

由于数据回传后需要存储,即数据在加密后需要支持解密以便保存;因此数据加密我们只能选择对称加密。

对称加密通常有 DES\3DES\AES 等,相较于 DES 和 3DES 算法而言,AES 算法有着更高的速度和资源使用效率,安全级别也较之更高,被称为下一代加密标准。同时,Python 和 Java 两种语言都对 AES 有良好支持,因而对称加密选择 AES。

此外,数据加密后通常为二进制字节流,考虑到直接网络上传递二进制字节流被截取后能直接进行解密操作,我们可以简单编码此二进制字节流以增加破解难度。我们选择 BASE64 进行二进制字节流编码与解码;而且 Python 和 Java 两种语言对 BASE64 都有很好且高性能实现。

至此,加密传输方案基本确定,流程梳理如下:

  • 发送方:–> Python
    图片等 Bytes –> AES 加密 Bytes –> Base64 String

  • 接收方:–> Java
    Base64 String –> Base64 解码 Bytes –> AES 解密 Bytes –> 图片等 Bytes

下面基于此方案分别进行 Python 和 Java 的实现。Java 中接收逻辑 — 首先进行 Base64 解码:

解码后进行 AES 解密。Java 中 AES 支持 CBC,CFB,ECB,OFB,PCBC 等模式,Python 中支持 ECB,CFB,CTR 等模式,两种语言中无构建参数时默认均为 ECB 模式,填充为 PKCS5Padding。实践中 Java 的 AES 实现需要显式指定参数,Java 中 AES 解密关键代码如下:

此处 Java 实现的 AES 解密,与一般的 Java 中 AES 解密有一定区别,具体代码区别暂不展开,有兴趣者可以自行查找比较。

Python 实现 AES 加密,然后 Base64 编码。Python 支持 AES 需要安装 PyCrypto,可以通过如下命令安装:

安装完成后,Python 中 AES 实现如下:

Python 中 AES 加密后进行 Base64 编码:

最后,通过 HTTP 请求,将 imgEncodestr 发送到j Java 服务提供接口即可,云应用产生数据加密传输至业务系统的跨语言实现 ( Python\Java ) 成功。

本文作者:周伟

您的留言将激励我们越做越好