跳到正文
发现
ejson:加密密钥版本管理工具
命令行工具开发者工具

ejson:加密密钥版本管理工具

用非对称加密把密钥安全存进 git 仓库的 Go 命令行工具,公钥内嵌、私钥留在本地。

admin
发布于 2026-10-30
浏览
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 整理,以原仓库为准。

更新记录

  1. v1.6.0当前版本

    安全加固:`ejson decrypt -o` 新建输出文件权限改为 0600(受 umask 限制),已有文件保持原权限原地更新;`ejson keygen -w` 私钥文件权限改为 0400,去掉同组读权限;输出文件关闭错误不再被忽略。

评论