首先确认你的档案软件满足2个前提:支持自定义上传/下载接口扩展、底层存储支持二进制文件替换。
需要提前安装的工具:
apt update && apt install openssl -y(Debian/Ubuntu)、yum install openssl -y(CentOS)docker run -d -p 8200:8200 --name vault -e 'VAULT_DEV_ROOT_TOKEN_ID=your_custom_token' vault:1.13.3必须提前对全量档案数据做异地备份,备份命令:rsync -avz /path/to/archive/storage/ 备份服务器IP:/path/to/backup/$(date +%Y%m%d)/,备份完成后随机抽取3-5份文件校验完整性。
进入档案软件后台扩展配置页,找到「文件上传前置钩子」、「文件下载后置钩子」两个配置项;若没有可视化配置页,直接修改服务端配置文件application.yml(Java架构)或config.py(Python架构),添加钩子路径。
完整配置内容如下: ```yaml 档案加密钩子配置 archive: encryption: enabled: true upload-hook: /opt/archive/hook/encrypt.py download-hook: /opt/archive/hook/decrypt.py key-vault-url: http://127.0.0.1:8200/v1/secret/data/archive-encryption vault-token: your_custom_token ```
配置完成后执行重启命令:systemctl restart archive-service,查看服务日志确认钩子加载成功。
采用安全等级最高的AES-256-GCM加密算法,执行命令生成256位密钥:openssl rand -hex 32,命令执行后会输出64位十六进制字符串,即为加密密钥,禁止将密钥明文存储在代码、配置文件中。

执行命令将生成的密钥存入Vault:
vault kv put secret/archive-encryption key=你生成的64位密钥
验证密钥存储成功:vault kv get secret/archive-encryption,确认输出的key值和生成的一致。
在/opt/archive/hook/目录下新建encrypt.py文件,内容如下:
```python
import os
import sys
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import requests
从Vault获取密钥
vault_url = "http://127.0.0.1:8200/v1/secret/data/archive-encryption"
headers = {"X-Vault-Token": "your_custom_token"}
res = requests.get(vault_url, headers=headers)
key = bytes.fromhex(res.json()["data"]["data"]["key"])
读取待加密文件
file_path = sys.argv[1]
with open(file_path, "rb") as f:
plaintext = f.read()
AES-256-GCM加密
nonce = os.urandom(12)
cipher = Cipher(algorithms.AES(key), modes.GCM(nonce), backend=default_backend())
encryptor = cipher.encryptor()
ciphertext = encryptor.update(plaintext) + encryptor.finalize()
写入加密后的文件(nonce+tag+密文拼接)
with open(file_path, "wb") as f:
f.write(nonce + encryptor.tag + ciphertext)
```
安装依赖:pip3 install cryptography requests
同目录下新建decrypt.py文件,内容如下: ```python import sys from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend from cryptography.exceptions import InvalidTag import requests 从Vault获取密钥 vault_url = "http://127.0.0.1:8200/v1/secret/data/archive-encryption" headers = {"X-Vault-Token": "your_custom_token"} res = requests.get(vault_url, headers=headers) key = bytes.fromhex(res.json()["data"]["data"]["key"]) 读取加密文件 file_path = sys.argv[1] with open(file_path, "rb") as f: nonce = f.read(12) tag = f.read(16) ciphertext = f.read() 解密 try: cipher = Cipher(algorithms.AES(key), modes.GCM(nonce, tag), backend=default_backend()) decryptor = cipher.decryptor() plaintext = decryptor.update(ciphertext) + decryptor.finalize() with open(file_path, "wb") as f: f.write(plaintext) except InvalidTag: print("密钥错误或文件被篡改") sys.exit(1) ```
编写批量加密脚本,分批次处理避免IO过载,可直接复制:
```bash
!/bin/bash
STORAGE_PATH="/path/to/archive/storage"
BATCH_SIZE=100
遍历所有文件,分批次加密
find $STORAGE_PATH -type f | xargs -n $BATCH_SIZE | while read batch; do
for file in $batch; do
python3 /opt/archive/hook/encrypt.py $file
done
每批次处理完休息1秒,避免CPU占满
sleep 1
done
```
执行脚本前先拿1个测试文件验证:python3 /opt/archive/hook/encrypt.py 测试文件路径 && python3 /opt/archive/hook/decrypt.py 测试文件路径,确认文件内容正常后再执行全量批量加密。
1. 随机抽取3份加密后的档案,直接打开查看是否为乱码,确认无法直接读取
2. 从档案软件前台下载这3份档案,查看是否能正常打开,内容完整
3. 上传1份新档案,确认上传后存储目录的文件为加密状态,下载正常
如果出现加密后文件无法解密的情况,直接执行备份恢复命令:rsync -avz 备份服务器IP:/path/to/backup/$(date +%Y%m%d)/ /path/to/archive/storage/,恢复完成后再排查密钥或脚本问题。