安全模型分发:加密、签名与完整性验证
bash
加密模型文件(使用 AES-256-CBC)
openssl enc -aes-256-cbc -salt -in model.pt -out model.pt.enc -k "your-strong-passphrase"
解密
openssl enc -d -aes-256-cbc -in model.pt.enc -out model.pt -k "your-strong-passphrase"
*注意*:密码短语需要以安全方式事先共享(如通过密码管理器或面对面交换),不能在同一信道发送。
### 非对称加密(RSA / ECIES)
用接收方的公钥加密,只有接收方的私钥能解密。无需提前共享对称密钥,更适合一对多分发。
**示例**:使用 `openssl` 和接收方提供的公钥 `receiver_pub.pem`
```bash
# 生成32字节随机对称密钥
openssl rand -out key.bin 32
# 用 AES 加密模型
openssl enc -aes-256-cbc -salt -in model.pt -out model.pt.enc -pass file:./key.bin
# 用 RSA 公钥加密该对称密钥
openssl rsautl -encrypt -inkey receiver_pub.pem -pubin -in key.bin -out key.bin.enc
# 分发 model.pt.enc 与 key.bin.enc
接收方用私钥解密 key.bin.enc 得到对称密钥,再解密模型。实践中可以使用更简单的工具,如 age(现代文件加密工具):
# 加密(使用接收方公钥)
age -r age1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx model.pt > model.pt.age
# 解密
age -d -i private_key.txt model.pt.age > model.pt
数字签名:证明“我发的,没改过”
数字签名的原理:用发送方私钥对文件的哈希值进行签名,然后将签名附在文件一起分发。接收方用发送方公钥验证签名,成功即代表文件确实来自该发送方,且内容未被篡改。
使用 GPG 签名
GPG(GNU Privacy Guard)是一个易用的加密与签名工具。
生成密钥对(一次性操作):
gpg --full-generate-key
# 选择 RSA 或 ECC,设定密钥用途为签名
对模型文件签名:
gpg --detach-sign --armor model.pt
# 生成 model.pt.asc 签名文件
接收方验证(需要先导入发送方公钥):
gpg --import sender_public.key
gpg --verify model.pt.asc model.pt
如果输出显示 Good signature,则模型来源正确且未被修改。--detach-sign 表示生成独立签名文件,不影响原文件。--armor 生成 base64 文本格式,方便在邮件或文档中传输。
使用 OpenSSL 签名(适合自动化脚本)
# 生成私钥(发送方)
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
# 提取公钥(发送方需分享给接收方)
openssl rsa -pubout -in private_key.pem -out public_key.pem
# 对文件进行 SHA-256 签名
openssl dgst -sha256 -sign private_key.pem -out model.sig model.pt
# 验证
openssl dgst -sha256 -verify public_key.pem -signature model.sig model.pt
验证通过会返回 Verified OK。
完整性验证:让损坏无处遁形
即使没有恶意攻击,网络传输也可能引入比特翻转。完整性验证可以快速捕捉到这些问题。最简单的办法是生成一个加密哈希,并与原始哈希比对。
计算文件的 SHA-256 哈希:
sha256sum model.pt > model.pt.sha256
# 或
openssl dgst -sha256 model.pt
接收方拿到文件和哈希后,重新计算哈希:
sha256sum -c model.pt.sha256
# 输出 model.pt: OK 或 FAILED
哈希值可以单独通过安全信道分发,或者与签名结合使用(因为签名本质上就是对哈希加密)。
一站式安全分发流程实战
下面是一个完整的“模型安全快递”脚本化流程,结合了加密、签名和完整性校验。假设接收方已经将公钥 receiver_pub.pem 交给了你,而你也提前将自己的签名公钥 sender_pub.pem 分享给了接收方。
发送方操作
# 1. 计算文件 SHA-256 哈希,并保存(可选)
sha256sum model.pt > model.pt.sha256
# 2. 用自己私钥对模型文件签名,生成 model.sig
openssl dgst -sha256 -sign private_key.pem -out model.sig model.pt
# 3. 用接收方公钥加密模型文件
openssl rsautl -encrypt -inkey receiver_pub.pem -pubin -in model.pt -out model.pt.enc
# 4. 发送文件列表:
# - model.pt.enc (加密后的模型)
# - model.sig (签名)
# - model.pt.sha256 (可选,用于解密后校验)
如果模型太大,RSA 加密有限制(一次性最多加密约 245 字节),建议改用混合加密方案(上一节中的 AES + RSA 方法),或使用 gpg 直接加密:
# 一步完成签名+加密(发送方需有接收方公钥)
gpg --sign --encrypt --recipient receiver@example.com model.pt
# 生成 model.pt.gpg,同时包含签名和加密内容
接收方操作
# 1. 解密
gpg --decrypt model.pt.gpg > model.pt
# 解密同时自动验证签名,输出签名状态
# 或者单独解密和验证:
openssl rsautl -decrypt -inkey receiver_private.pem -in model.pt.enc -out model.pt
openssl dgst -sha256 -verify sender_pub.pem -signature model.sig model.pt
# 2. 检查完整性
sha256sum -c model.pt.sha256