敏感信息加密方案
实现 AES 对称加密,自动检测并加密知识库中的敏感信息
一、背景
1.1 问题现状
用户要求知识库记录中的敏感信息(邮箱、账号、密码、key 等)必须加密存储,避免隐私泄露。
1.2 目标
- 实现敏感信息自动检测
- 实现 AES 对称加密
- 在 markdown 中用特殊标记存储
- 集成到知识库记录流程
1.3 约束条件
- 加密方式:AES 对称加密
- 密钥存储:安全位置,不暴露在公开文档
- 格式要求:
{{encrypted:密文|类型}}
二、方案设计
2.1 技术选型
| 方案 | 优点 | 缺点 | 结论 |
|---|---|---|---|
| RSA 非对称加密 | 安全性高 | 2048位只能加密245字节 | ❌ 放弃 |
| AES 对称加密 | 效率高,无长度限制 | 密钥管理 | ✅ 采用 |
| 混合加密 | 兼顾安全和效率 | 实现复杂 | ❌ 过度设计 |
2.2 实现架构
明文 → 敏感信息检测 → AES加密 → Base64编码 → {{encrypted:密文|类型}}
2.3 关键决策
| 决策点 | 选择 | 理由 |
|---|---|---|
| 加密算法 | AES-256-CBC | 安全性足够,效率高 |
| 密钥派生 | SHA256(密钥字符串) | 固定长度32字节 |
| 填充方式 | PKCS7 | 标准方式 |
| 输出格式 | Base64 | 可存储在文本中 |
三、执行过程
3.1 步骤记录
步骤1:创建加密工具
路径:/data/nanobot-workspace/scripts/sensitive_crypto.py
核心函数:
encrypt_text(plaintext)- 加密文本decrypt_text(ciphertext_b64)- 解密文本detect_sensitive(text)- 检测敏感信息encrypt_sensitive(text)- 加密文本中的敏感信息
结果:✅ 加密工具创建完成
步骤2:定义敏感信息类型
| 类型 | 正则模式 | 示例 |
|---|---|---|
[a-zA-Z0-9._%+-]+@... | xxx@example.com | |
| phone | 1[3-9]\d{9} | 138xxxxxxxx |
| api_key | sk-[a-zA-Z0-9]{20,} | sk-xxx… |
| github_token | ghp_[a-zA-Z0-9]{36} | ghp_xxx… |
| aws_key | AKIA[0-9A-Z]{16} | AKIAXXX… |
| private_ip | 192.168.x.x 等 | 192.168.x.x |
| id_card | \d{17}[\dXx] | 身份证号 |
结果:✅ 检测规则定义完成
步骤3:创建占位符白名单
为避免误报,添加占位符白名单:
xxx@example.com- 邮箱占位符138xxxxxxxx- 手机占位符192.168.x.x- IP 占位符sk-xxx...- API Key 占位符
结果:✅ 白名单添加完成
3.2 时间线
| 时间 | 事件 |
|---|---|
| 19:00 | 开始实现加密方案 |
| 19:10 | 完成基础加密功能 |
| 19:20 | 测试通过 |
| 19:24 | 用户指出密钥暴露问题 |
| 19:30 | 修复:密钥移到 .env |
| 19:40 | 添加占位符白名单 |
| 19:50 | 完善文档 |
四、遇到的问题
问题1:密钥直接暴露在公开文档中
现象:密钥直接写在 markdown 文件中
原因分析:
- 安全意识不足
- 没有考虑文档会被公开
解决方案:
- 密钥移到
.env文件(权限 600,不提交 git) - 脚本从环境变量读取密钥
- 文档中删除密钥,只写”密钥存储在安全位置”
验证结果:✅ 密钥已移除,文档已脱敏
问题2:占位符被误报为敏感信息
现象:xxx@example.com 被检测为敏感信息
原因分析:
- 正则表达式没有排除占位符
解决方案: 添加占位符白名单,检测时跳过:
PLACEHOLDER_PATTERNS = [
r'xxx@example\.com',
r'138xxxxxxxx',
r'192\.168\.x\.x',
...
]验证结果:✅ 占位符不再误报
五、结果与验证
5.1 最终产出
| 产出物 | 路径 | 状态 |
|---|---|---|
| 加密工具 | /data/nanobot-workspace/scripts/sensitive_crypto.py | ✅ 已完成 |
| 密钥文件 | /data/nanobot-workspace/scripts/.env | ✅ 已创建 |
| 检测脚本 | /data/nanobot-workspace/scripts/journal.sh | ✅ 已完成 |
5.2 使用方法
# 检测敏感信息
python3 sensitive_crypto.py detect <文件路径>
# 加密
python3 sensitive_crypto.py encrypt <文件路径>
# 解密
python3 sensitive_crypto.py decrypt <文件路径>5.3 加密格式示例
原文:xxx@example.com(真实邮箱)
加密后:{{encrypted:GV4x2UARIJcMJHSnr3X6ow==|email}}
六、反思与改进
6.1 做得好的
- 加密功能完整
- 检测规则覆盖全面
- 占位符白名单避免误报
6.2 需要改进的
- 密钥管理可以更安全(如使用系统密钥环)
6.3 经验教训
⚠️ 重要教训,避免再次犯错
-
敏感信息绝对不能出现在公开文档中
- 错误做法:直接写密钥、真实邮箱、真实手机
- 正确做法:密钥放 .env,文档用占位符
-
写文档前先过检测
- 错误做法:写完直接发布
- 正确做法:先运行
journal.sh检测
七、参考资料
附录
相关文件
| 文件路径 | 说明 |
|---|---|
/data/nanobot-workspace/scripts/sensitive_crypto.py | 加密工具 |
/data/nanobot-workspace/scripts/.env | 密钥文件 |
/data/nanobot-workspace/scripts/journal.sh | 检测脚本 |