用 Python 做一下数据压缩和解压处理

Actions 中,设置了 secrets 变量,存入的数据比较大,所以用了一下数据压缩方法进行存储。同时保障代码中的数据脱敏。

先看代码

压缩数据

# 程序代码和数据脱敏
# coding: utf-8
import base64
import bz2
import json

# 演示使用的数据
USER_TABLE = {
    '176xxxx5668': '用户名 1',
    # ...
    '185xxxx7213': '用户名 N',
}
print(f'手机号数量 1:{len(USER_TABLE)}')
mobile = list(USER_TABLE.keys())
print(f'手机号数量 2:{len(mobile)}')
mobile = list(set(mobile))
print(f'排重后的手机号数量:{len(mobile)}')

# 压缩数据
data = json.dumps(mobile)
len1 = len(data)
com_data = bz2.compress(data.encode('utf-8'), compresslevel=9)
len2 = len(com_data)
print(f'原始数据长度:{len1},压缩后长度:{len2}, 压缩率:{len1/len2:.2f}')
b64_data = base64.b64encode(com_data).decode('utf-8')
len3 = len(b64_data)
print(f'原始数据长度:{len1},压缩后长度:{len3}, 压缩率:{len1/len3:.2f}')

print('下面这段输出就是存入 Action Secret 中的变量值')
print('-' * 80)
print(b64_data)
print('-' * 80)

解压数据并使用

下面的代码整理后,放到 Action 的执行代码合适的位置,对 Action Secret 变量处理后,使用

decom_data = base64.b64decode(b64_data)
len4 = len(decom_data)
print(f'Base64反解后长度:{len4} 是否一致:{decom_data == com_data}')
decom_data = bz2.decompress(decom_data).decode('utf-8')
len5 = len(decom_data)
print(f'解压后长度:{len5}, 是否一致:{decom_data == data}')
# 验证
decom_data = json.loads(decom_data)
print(type(decom_data), len(decom_data), len(mobile))
print(f'验证结果:{len(decom_data) == len(mobile)}')

其它说明

  1. 使用 Github Actions 的 Secret 存储敏感数据
  2. 对于列表、字典等复杂类型的数据,尽量存储为 base64 格式的数据
  3. 数据量较大的,通过 bz2 或其它压缩形式,对数据进行压缩处理
  4. 使用前,从 Secret 变量中,读取 base64 后的压缩数据,转换成对应的类型数据后方可正常使用
  5. 在 Actions 程序执行时,尽量不要把敏感数据内容输出到控制台
赞赏