9 个不稳定版本 (3 个破坏性更新)

0.4.1 2023年9月22日
0.4.0 2023年9月15日
0.3.0 2023年9月10日
0.2.1 2023年9月9日
0.1.2 2023年9月5日

#595 in 命令行工具

MITLGPL-3.0+

47KB
965

(r)EJSON

CI Latest version Docs codecov

rejson 是一个用于在源代码管理中管理密钥集合的工具。密钥使用 公钥椭圆曲线 密码学 (NaCl Box: Curve25519 + Salsa20 + Poly1305-AES) 进行加密。密钥被收集在一个 JSON 文件中,其中所有字符串值都是加密的。公钥嵌入在文件中,解密器从其本地文件系统中查找对应的私钥。

这是 EJSON 的 Rust 版本,增加了一些功能。所有荣誉都应归功于制作 EJSON 的团队。这里没有创新,只是需要 Rust 绑定并且想要一些我认为不适合上游的额外功能。

安装

发布版本

curl -fsSL https://github.com/pseudomuto/rejson/releases/download/v0.2.0/rejson_0.2.0_$(uname -s)_$(uname -m).tar.gz | tar xzf -

使用 Cargo

cargoinstall rejson

由于这是一个 ejson 的直接替代品,如果您喜欢,可以添加 alias ejson="rejson"。预期的是这与 ejson 完全兼容,并且是附加的。如果不是这样,那是一个错误,我会很感激您提交问题。

EJSON 的新增功能

  • decrypt 中添加了 --strip-key 标志,它将从结果中删除 _public_key
  • 添加了 env 命令,该命令将导出顶级 environment 键下的所有密钥。
  • 添加了 kube-secrets 命令,该命令将输出位于 kubernetes 键下的 K8s 密钥声明。

用法

CLI

请参阅 rejson -h 或 (cargo run -- -h) 以获取使用说明。

A command line utility for managing secrets

Usage: rejson <COMMAND>

Commands:
  encrypt  Encrypt one or more EJSON files
  decrypt  Decrypt an EJSON file
  keygen   Generate a new EJSON key pair
  env      Export the all scalar values under the "environment" key
  help     Print this message or the help of the given subcommand(s)

Options:
  -h, --help     Print help
  -V, --version  Print version

要导出环境密钥中的所有环境值,请运行 eval $(rejson env secrets.ejson)

{
  "_public_key": "...",
  "environment": {
    "SOME_KEY": "SOME_VALUE"
  }
}

Docker

为每个rEJSON版本发布了一个docker镜像。用法与使用二进制文件类似,只需使用加密/解密功能时需要 /keys/files 卷。

# generate a new key pair
docker run --rm -it rejson keygen

# encrypt a file to disk
docker run --rm -it \
  -v $(pwd)/keys:/keys \
  -v $(pwd)/secrets:/files \
  rejson encrypt /files/secrets.ejson

# decrypt a file to stdout
docker run --rm -it \
  -v $(pwd)/keys:/keys \
  -v $(pwd)/secrets:/files \
  rejson decrypt /files/secrets.ejson

代码

use std::fs;

use rejson::{KeyPair, SecretsFile};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let file = "examples/data/secrets.ejson";
    let mut secrets_file = SecretsFile::load(file).expect("failed to load file");
    secrets_file.transform(rejson::compact()?)?;
    secrets_file.transform(rejson::encrypt(&secrets_file)?)?;

    let json = secrets_file.to_string();
    let data = json.as_bytes();
    fs::write(file, data)?;

    println!("Wrote {} bytes to {}", data.len(), file);
    Ok(())
}

有关更多内容,请参阅 examples 目录。

开发

本地设置

  • 请确保您已安装夜间工具链(仅用于rustfmt)
  • 添加pre-commit以避免提交格式不正确的代码
ln -sf ../../build/pre-commit .git/hooks/pre-commit

发布新版本

运行 build/release <new_version>。这将

  • 更新Cargo.toml中的版本
  • 创建一个包含消息 "Release v" 的新提交
  • gittag -sm "Release v<version"v<version>
  • gitpush --tags

一旦发布管道完成并发布了crate,请运行以下命令以创建带有附加的二进制文件等的GitHub发布。

goreleaser release --clean

是的,我已经将goreleaser黑客成认为这是一个go项目,这样我就可以利用它来运行交叉编译、发布docker镜像和设置GitHub发布。

依赖项

~5.5–7.5MB
~130K SLoC