明文 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
-
单人或小团队:
lockgit init自动生成 256-bit 对称密钥,base32 编码后 52 字符,可复制到 1Password 或 CI 变量。 -
多人协作:
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 检查有无明文误提 |
常见坑与快速修复
-
历史曾提交明文
即便后续用 lockgit,旧 commit 仍裸奔。解决:git filter-repo --path .env.prod --invert-paths lockgit rotate-key # 换新密钥 git push --force-with-lease -
.gitattributes 规则漏文件
在 CI 加一步:lockgit status | grep "not encrypted" && exit 1提前失败,防止明文混进去。
-
对称密钥泄露
立即轮换密钥并作废所有下游部署,重新加密后发新版。
与 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 add、git diff 的习惯,却让明文 secrets 永远失去出镜机会。只要你在 .gitattributes 里写好规则、在 CI 里注入密钥,剩下的交给 256-bit AES 即可。下次再看到 “某云密钥被爬虫搜到” 的新闻,你可以安心地喝一口咖啡 —— 自己的仓库早已密不透风。
参考资料
[1] LockGit 镜像仓库:https://gitcode.com/gh_mirrors/lo/lockgit
[2] CSDN 教程:LockGit 项目使用教程,2024