5 个版本
0.1.7 | 2024 年 6 月 20 日 |
---|---|
0.1.6 | 2024 年 6 月 4 日 |
0.1.5 | 2024 年 3 月 8 日 |
0.1.4 | 2024 年 1 月 25 日 |
0.1.3 | 2024 年 1 月 24 日 |
#680 in 密码学
每月下载 39 次
55KB
1K SLoC
鲁德里奇
一个简单的机密存储库。
鲁德里奇使从命令行管理机密变得简单直观。机密信息以加密形式存储在磁盘上,并在需要时快速解密并添加到所需的环境中。明文机密信息仅在内存中存储。
目的
我经常使用 .env
文件来存储敏感数据,如 API 密钥和个人访问令牌。虽然 .env
文件在 Linux 和 Mac 上默认“隐藏”,但这并不是真正的 安全。任何人都可以在文件系统中使用 grep 查找各种明文机密信息。将机密信息加密存储,并在需要时解密,将是一个更好的解决方案。
安装
目前支持以下安装方法
cargo安装 rudric
nix install github:mike-lloyd03/rudric
(需要启用 Flakes)
使用方法
.env
文件可以用 .renv
文件替换,它使用类似 bash 的语法来定义环境变量。
GITHUB_TOKEN={{personal_github_token}}
GITHUB_API=https://api.github.com
这将创建一个名为 GITHUB_TOKEN
的环境变量,其值设置为您的保险库中名为 personal_github_token
的机密值。此外,还可以在此处存储非机密值,并且它们也将被设置到环境中。
可以在单个环境变量中使用多个机密信息。此外,还支持字符串插值。
DATABASE_URL=postgres://{{pg_user}}:{{pg_pass}}@localhost:5432
使用 rudric env <shell_name>
,可以将这些变量设置到您的环境中。
fish:
rudric env fish | source
bash:
source <(rudric env bash)
可以通过在配置文件中设置来指定默认的 shell。
入门指南
初始化
第一步是使用 rudric init
生成一个新的保险库。您将被要求设置主密码。完成后,您的保险库将被创建。
与保险库交互
可以创建、检索、编辑和删除机密信息。
rudric create <new_secret_name>
将打开一个文本编辑器(由EDITOR
或VISUAL
环境变量定义)。用户可以选择使用--file
标志从文件内容创建一个秘密。或者,如果会话处于活动状态,用户可以通过从另一个进程管道文本来创建秘密。
pwgen -1 14 | rudric create <new_secret_name> -
[!重要] 为了正确地从管道中读取,必须设置有效的会话令牌。目前,Rustcrate
dialoguer
存在一个bug,这阻止了在将数据管道输入程序时正确显示输入提示。
以下其他命令也受到支持
- 编辑
- 列出
- 删除(要求确认)
- 更改密码
会话
为了避免每次与保险库交互时都输入主密码,您可以创建一个会话令牌,该令牌必须设置为环境变量中的RUDRIC_SESSION
。这个简写可能看起来像这样。
set -x RUDRIC_SESSION $(rudric session)
会话令牌默认有效期为8小时,但可以配置。可以使用rudric session end
命令撤销当前会话令牌。
加密
主密码使用Argon2i算法进行加盐和散列。
在写入数据库之前,使用XChaCha20Poly1305加密秘密值。
使用基于Argon2i的密钥派生函数从主密码派生出一个更高阶的密钥。此密钥用于加密和解密秘密。
会话令牌
会话令牌生成是一种便利,显然为了实现这种便利而做出了一些安全妥协。然而,通过适当管理您的会话令牌,风险很低。永远不要将您的会话令牌存储在磁盘上。如果有人能够获取您的保险库数据库和您的会话令牌,那么您的所有秘密都可以被解密。
会话令牌生成
会话令牌使用以下方法生成
- 设置一个过期时间。
- 生成一个随机密钥(会话密钥)并将其写入保险库。
- 从主密码和存储的盐中派生出用户的密钥。
- 将密钥与过期时间连接起来。使用会话密钥进行加密。
- 再次将加密的过期时间和密钥与会话密钥的UUID连接起来。将其进行base64编码并返回给用户作为会话令牌。
如果环境设置了RUDRIC_SESSION
令牌
- 使用会话令牌中找到的UUID从数据库中获取会话密钥
- 使用会话密钥从会话令牌中解密过期时间和密钥
- 如果令牌未过期,则使用密钥与保险库中的秘密交互。
配置
Rudric可以通过一个toml文件进行配置。默认情况下,此文件存储在XDG_CONFIG/rudric/config.toml
(Linux和Mac上的$HOME/.config/rudric/config.toml
)。所有配置选项都是可选的。一个示例配置文件可能看起来像这样
# Options are: bash, zsh, fish, nu (default "bash")
default_shell = "fish"
# Specify the default length of time that a session token is valid for (default "8h")
session_lifetime = "6h"
# Specify the name of the file to use in the CWD for setting environment variables (default ".renv")
renv_filename = ".env"
direnv
Rudric包括对direnv
的支持。但是,为了使用它,您必须在使用direnv
之前启动一个Rudric会话。
只需将以下内容添加到您的.envrc
文件中
$(rudric env direnv)
将目录更改为同时包含.envrc
和.renv
文件的目录,将自动将加密的秘密导入到环境变量中。
【重要】FISH 用户:如果未设置有效的会话令牌,切换到具有受信任
.envrc
的目录将会提示您输入密码。这将失败,并且您的终端将会挂起,因为输入不会传递给 Rudric。这是由于direnv
在fish
中无法读取 stdin 的一个错误。作为解决方案,您可以在
.envrc
文件的顶部添加stty sane
stty sane $(rudric env direnv)
参见
https://github.com/direnv/direnv/issues/967
https://github.com/direnv/direnv/issues/1237
Crates
加密全部通过使用出色的 Orion 库完成。
使用的其他 crates
- clap
- sqlx
- dialoguer
- serde
- colored_json
- tabled
依赖
~65MB
~1M SLoC