Hotdry.
ai-security

LockGit:Go 实现的 Git 加密密钥仓,一键解决本地/CI 明文泄露

介绍 LockGit 的加密机制、CLI 用法与 CI 集成要点,给出可落地的密钥长度、权限、rotate 参数与监控脚本,彻底杜绝本地与持续集成中的明文 secrets 泄露风险。

明文 secrets 的 “零日” 隐患

在本地开发或 CI 日志里留下明文 .env.pem 早已成为入侵者的 “低垂果实”。传统做法是把文件写进 .gitignore,虽然能阻止提交,却破坏了 “一键拉起新环境” 的体验;而 HashiCorp Vault、AWS Secrets Manager 之类又太重,小团队往往因成本与运维复杂度望而却步。LockGit 用 7 MB 的单二进制,把 AES-256 加密直接嵌进 Git 工作流,既保留版本追踪,又确保任何时刻落盘的都是密文。

LockGit 设计哲学:git-first、zero-dependency

LockGit 完全用 Go 实现,编译后静态链接,无需 libcrypto 或 GPG 环境。核心思路是 “透明加密”:

  • 加密粒度为文件级,随机 IV 与密钥派生,让同一文件两次提交看不出重复;
  • 密文以 32 字节随机 ID 命名存于 data/manifest 记录明文路径→ID 映射,diff 时只显示映射变更,不暴露文件体积;
  • 历史记录里永远见不到明文,即便攻击者拿到整库,也只能看到一堆无法关联的密文块。

两条密钥路线:个人对称 vs 团队 GPG

  1. 单人或小团队: lockgit init 自动生成 256-bit 对称密钥,base32 编码后 52 字符,可复制到 1Password 或 CI 变量。

  2. 多人协作: lockgit add-gpg-user alice@example.com 把仓库密钥用 GPG 公钥再包一层,落入 .git-crypt/keys/。新人入职只需把 GPG 公钥丢给管理员,即可被授权,离职时移除对应公钥即可轮换。

日常三步走:init → add → commit

# 1. 初始化 vault
lockgit init
# 2. 把敏感文件纳入加密范围
echo "*.env filter=lockgit diff=lockgit" > .gitattributes
lockgit add .env.prod
# 3. 提交(自动加密)
git commit -m "chore: add prod secrets"

本地解密同样一键:

lockgit unlock
# 编辑完再锁上
lockgit lock

CI 零配置集成:一行命令解锁

把对称密钥 base64 后存进 LOCKGIT_KEY,流水线里只需:

# GitHub Actions 示例
- name: Decrypt secrets
  run: |
    echo "$LOCKGIT_KEY" | base64 -d > /tmp/key
    lockgit unlock /tmp/key
    rm /tmp/key
- name: Run tests
  run: make test

解锁后 .env.prod 以明文出现在工作区,容器构建、单元测试无感使用;任务结束 runner 销毁,密钥文件零残留。

可落地的安全参数与 checklist

维度 推荐值 说明
加密算法 AES-256-GCM Go 标准库 crypto/aes,已抗侧信道
密钥长度 32 byte lockgit 默认,勿自改
派生函数 scrypt(N=2¹⁵,r=8,p=1) 约 100 ms / 次,可抗暴力破解
文件权限 600 密钥、解密后明文都必须 600
密钥轮换 90 天 lockgit rotate-key 一键重新加密全库
审计脚本 lockgit status 每日 CI 检查有无明文误提

常见坑与快速修复

  1. 历史曾提交明文
    即便后续用 lockgit,旧 commit 仍裸奔。解决:

    git filter-repo --path .env.prod --invert-paths
    lockgit rotate-key   # 换新密钥
    git push --force-with-lease
    
  2. .gitattributes 规则漏文件
    在 CI 加一步:

    lockgit status | grep "not encrypted" && exit 1
    

    提前失败,防止明文混进去。

  3. 对称密钥泄露
    立即轮换密钥并作废所有下游部署,重新加密后发新版。

与 git-crypt、git-secret 的 30 秒对比

工具 依赖 密钥模式 体积 备注
LockGit 0 对称 / GPG 7 MB Go 单二进制,diff 友好
git-crypt libcrypto GPG / 对称 50 KB C 实现,需编译
git-secret GPG 仅 GPG bash 脚本 功能多,但 Windows 需 Cygwin

若团队已全 GPG 且熟悉 gpg-agent,git-crypt/git-secret 亦可;若想 “下载即用”,LockGit 最省时间。

结论:把 “别忘了加密” 变成 “默认就加密”

LockGit 把加密从额外的意志消耗变成 Git 工作流的一部分:不改变 git addgit diff 的习惯,却让明文 secrets 永远失去出镜机会。只要你在 .gitattributes 里写好规则、在 CI 里注入密钥,剩下的交给 256-bit AES 即可。下次再看到 “某云密钥被爬虫搜到” 的新闻,你可以安心地喝一口咖啡 —— 自己的仓库早已密不透风。


参考资料
[1] LockGit 镜像仓库:https://gitcode.com/gh_mirrors/lo/lockgit
[2] CSDN 教程:LockGit 项目使用教程,2024

查看归档