敏感信息加密方案

实现 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:定义敏感信息类型

类型正则模式示例
email[a-zA-Z0-9._%+-]+@...xxx@example.com
phone1[3-9]\d{9}138xxxxxxxx
api_keysk-[a-zA-Z0-9]{20,}sk-xxx…
github_tokenghp_[a-zA-Z0-9]{36}ghp_xxx…
aws_keyAKIA[0-9A-Z]{16}AKIAXXX…
private_ip192.168.x.x192.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 文件中

原因分析

  • 安全意识不足
  • 没有考虑文档会被公开

解决方案

  1. 密钥移到 .env 文件(权限 600,不提交 git)
  2. 脚本从环境变量读取密钥
  3. 文档中删除密钥,只写”密钥存储在安全位置”

验证结果:✅ 密钥已移除,文档已脱敏

问题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 经验教训

⚠️ 重要教训,避免再次犯错

  1. 敏感信息绝对不能出现在公开文档中

    • 错误做法:直接写密钥、真实邮箱、真实手机
    • 正确做法:密钥放 .env,文档用占位符
  2. 写文档前先过检测

    • 错误做法:写完直接发布
    • 正确做法:先运行 journal.sh 检测

七、参考资料


附录

相关文件

文件路径说明
/data/nanobot-workspace/scripts/sensitive_crypto.py加密工具
/data/nanobot-workspace/scripts/.env密钥文件
/data/nanobot-workspace/scripts/journal.sh检测脚本