ejson:加密密钥版本管理工具
用非对称加密把密钥安全存进 git 仓库的 Go 命令行工具,公钥内嵌、私钥留在本地。
- 浏览
- 3
- 访问
- 0
- 下载
- 0
- 版本
- v1.6.0
- 平台
- Windows、macOS、Linux
详细介绍
项目简介
ejson 是一个用 Go 编写的小工具,用来在源码版本控制中管理一组密钥(secrets)。密钥集中放在一个 JSON 文件里,文件中所有字符串值都会被加密;公钥内嵌在文件里,解密方从本地文件系统按公钥查找对应的私钥。加密使用 NaCl Box 非对称加密(Curve25519 + Salsa20 + Poly1305-AES)。

主要功能
- 密钥可以安全地提交进 git 仓库
- 用
git blame就能逐行审计密钥的变更 - 任何有提交权限的人都能写入新的密钥
- 解密权限可以只开放给生产服务器
- 密钥与应用程序源码同步变更,不必依赖配置管理系统下发
- 代码量小、测试完善、易于审计
配套工具:ejson2env 可把部分密钥导出为环境变量;用 Capistrano 部署可搭配 capistrano-ejson 自动解密;使用 pre-commit 可以在提交时自动加密。
安装与使用
可以从 GitHub Releases 下载 .deb 包。开发机(64 位 Linux 或 OS X)推荐用 Homebrew 安装:
brew tap shopify/shopify
brew install ejson
1. 准备 keydir
默认从 /opt/ejson/keys 读取密钥,可通过环境变量 EJSON_KEYDIR 或 -keydir 选项修改。
mkdir -p /opt/ejson/keys
macOS 用户默认对该目录没有写权限,需要先执行 sudo chown -R $(whoami) /opt/ejson。
2. 生成密钥对
不带参数时会把公钥和私钥打印到标准输出;加 -w 则直接把密钥写入 keydir,只打印公钥。
ejson keygen -w
3. 创建 ejson 文件
文件顶层必须有 _public_key 字段,值为 ejson keygen 生成的 32 字节(64 个 ASCII 字符)十六进制公钥。
4. 加密
运行 ejson encrypt test.ejson 会就地加密文件中新的明文字符串,已有的密文以及以下划线开头的键保持不变。
5. 解密
ejson decrypt foo.ejson 只接受一个文件参数,把结果打印到标准输出;需要写文件时用 ejson decrypt -o output.json foo.ejson。
格式说明
- 文件就是普通 JSON
- 顶层必须有
_public_key - 所有非对象键的字符串字面量默认加密(
{"a": "b"}中"b"加密,"a"不加密) - 数字、布尔值和 null 不加密
- 以下划线开头的键,其对应值不加密,可用于实现元数据;下划线不会向下传递,例如
{"_a": {"b": "c"}}中的"c"仍会被加密
注意事项
- 从 v1.6.0 起,
ejson decrypt -o新建的输出文件权限为0600(再受进程 umask 限制);已存在的输出文件保持原有权限和属主,原地更新。升级不会收紧旧文件的权限,旧文件需要另外检查。 - 如果希望输出能被其他用户或组读取,应先按目标权限和属主创建好目标文件,再执行解密。
ejson keygen -w生成的私钥文件权限为0400。- 命令行会跟随符号链接,也不会收回已打开该文件的进程的访问权限;shell 重定向(
ejson decrypt foo.ejson > output.json)使用的是 shell 的文件创建权限,而不是 CLI 的。 - 输出请放在可信、其他不可信用户无法写入的目录中。
本作品整理自 GitHub 开源项目 Shopify/ejson,原作者 @Shopify,许可证 MIT。中文介绍由 AI 根据项目 README 整理,以原仓库为准。
更新记录
- v1.6.0当前版本
安全加固:`ejson decrypt -o` 新建输出文件权限改为 0600(受 umask 限制),已有文件保持原权限原地更新;`ejson keygen -w` 私钥文件权限改为 0400,去掉同组读权限;输出文件关闭错误不再被忽略。
评论