基于数字信封思想的加密传输实践

211 阅读4分钟

介绍

在传统的数据传输中,基本上以公私钥非对称加密和对称加密两种方式为主。其中非对称加密的逻辑,是双方各自持有公私秘钥之一,公钥方将数据加密后传给对方,对方通过私钥解密得到原始内容。但是非对称加密有一个致命缺陷就是计算量大,耗时较长,同时得到的加密数据文件也相对较大。而对称加密思路,则是类似于配置一个公共密码的东西,加密密码就是解密密码,计算量较小且文件体积也不会过度膨胀。但对称秘钥的问题就是在于密码双方都将会持有,如果是长期有效密码则可能会存在泄露的问题,而如果是短期密码则又会存在密码传输时被拦截的风险。

数字信封则是融合两种思想,对内容和密码同时加密,降低加解密时长、文件体积,同时尽可能降低密码泄露导致的风险问题。这种处理逻辑主要是包含了对数据加密和对加密密码进行加密两个主要步骤,保障传输中的数据内容和解密密码都是密文状态。

在我整理输出的加解密流程中,用于对用户数据内容加密的密码是临时生成的,这样可以保障密码都是一次性的,从而尽可能降低该密码泄露导致的后续影响,而用于对这个临时密码进行加解密的非对称公私钥则是双方通过邮件、系统工单或线下等方式进行沟通同步的,在接口或传输中不存在该非对称秘钥的交换,而同时基于系统安全性考虑,该非对称必要也可以通过邮件等渠道进行周期性替换,从而尽可能提升系统整体的安全性。

本文将提供的解决方案中,压缩加解密等工具的选取为:

  • 压缩/解压缩: zip/unzip
  • 校验码生成: md5sum
  • 临时密码: uuidgen
  • 对压缩包加解密: openssl pbkdf2
  • 生成公私密钥对: openssl genpkey
  • 对临时密码加解密: openssl pkeyutl

具体操作流程

步骤0:前期准备

数据接收方使用openssl创建公私秘钥对,得到私钥文件rsa_private.pem和公钥文件rsa_public.pem。将公钥文件提供给数据传输方,数据接收方自行保管公钥文件。

# 创建长度为1024位的私钥文件 rsa_private.pem*  
openssl genpkey -algorithm RSA -out 私钥.pem  
# 基于该私钥,生成公钥文件 rsa_public.pem*  
openssl rsa -in 私钥.pem -pubout -out 公钥.pem

image.png

步骤1:数据准备

用户使用zip命令或使用可视化工具将文件进行压缩,处理得到压缩文件包(未加密状态),并通过md5sum命令或可视化工具生成md5校验码

image.png

image.png

步骤2:文件加密

步骤2-1 生成临时密码

例如使用uuid工具生成临时密码

uuidgen *# 81E0F5DC-D323-469F-BB76-1E2F887F238F

image.png

步骤2-2 对压缩包加密

通过openssl工具,使用临时密码对压缩包进行加密

echo "81E0F5DC-D323-469F-BB76-1E2F887F238F" | openssl aes-256-ecb -salt -pbkdf2 -in 数据文件.zip -out 加密数据文件.zip.enc -pass stdin

预览内容(显示乱码):

image.png 尝试解压(无法解压):

image.png

步骤2-3 使用公钥对临时密码进行加密

echo "81E0F5DC-D323-469F-BB76-1E2F887F238F" | openssl pkeyutl -encrypt -pubin -inkey 公钥.pem -out 使用公钥加密后的密码.txt

image.png 尝试预览加密后的密码(显示乱码):

image.png

步骤3:数据传输

步骤3-1 内容文件传输

将加密后的压缩包文件“加密数据文件.zip.enc”、校验文件“校验文件.txt”通过ftp传输给接收方

image.png

临时密码传输

使用接口方式将通过公钥加密后的临时密码文件提供给接收方

image.png

步骤4:数据使用

步骤4-1 解密临时密码

业务侧通过私钥进行解密,得到密码明文

openssl pkeyutl -decrypt -inkey 私钥.pem -in 使用公钥加密后的密码.txt -out 解密后的密码文件.txt  
# 81E0F5DC-D323-469F-BB76-1E2F887F238F

image.png

image.png

步骤4-2 解密文件

使用解密后的明文密码解密压缩包,得到原始文件压缩包

openssl aes-256-ecb -d -salt -pbkdf2 -in 加密数据文件.zip.enc -out 解密后的压缩包.zip -pass file:解密后的密码文件.txt

image.png

步骤4-3 解压缩

使用unzip命令或双击压缩包,解压得到原始数据文件

unzip 解密后的压缩包.zip

image.png

image.png