73 个版本
0.7.3-rc.1 | 2023 年 8 月 4 日 |
---|---|
0.7.2 | 2023 年 3 月 5 日 |
0.7.1 | 2023 年 2 月 24 日 |
0.6.0 | 2022 年 6 月 29 日 |
0.1.3 | 2020 年 7 月 18 日 |
#141 in 加密学
143 每月下载次数
165KB
2.5K SLoC
kbs2
警告!kbs2
是测试版质量的软件!使用 kbs2
意味着您可能随时会丢失或泄露秘密!
kbs2
是一个用于管理 秘密 的命令行工具。
快速链接
安装
软件包
kbs2
可通过多种官方和社区提供的软件包获取。
请参阅下面的矩阵,以获取包含 kbs2
的存储库列表。
如果您不是在开发它,这些软件包是推荐安装 kbs2
的方式。
Debian/Ubuntu
这是一个官方软件包。
如果您正在使用 AMD64 架构的 Debian 或 Ubuntu 发行版,您可以使用附在 最新版本 中的 .deb
软件包。
例如
$ wget https://github.com/woodruffw/kbs2/releases/download/v0.7.2/kbs2_0.7.2_amd64.deb
$ sudo dpkg -i kbs2_0.7.2_amd64.deb
# don't forget to request kbs2's dependencies
$ sudo apt-get -f install
Arch Linux
这是一个社区维护的软件包。
kbs2
可以通过 AUR 软件包 使用 AUR 辅助工具 安装。例如,
$ yay -S kbs2
其他发行版将迟早得到支持。通过查看 开放的打包问题 帮助我们!
Nix
这是一个社区维护的软件包。
kbs2
可以通过 Nix 安装
$ nix-env -iA nixpkgs.kbs2
货物
如果您是Linux用户,您将需要一些X11库。对于基于Debian的发行版
$ sudo apt install -y libxcb-shape0-dev libxcb-xfixes0-dev
kbs2
本身最简单的方式是通过cargo
进行安装
$ cargo install kbs2
安装后,kbs2
就完全准备好可以使用。请参考配置部分,了解您可以进行的某些可选更改。
快速入门指南
初始化一个新的kbs2
配置
$ kbs2 init
默认情况下,新的kbs2
配置将记录存储在$HOME/.local/share/kbs2
。用户可以通过将--store-dir DIR
传递给kbs2 init
来覆盖此设置,或者在任何时候通过修改配置文件中的store
来实现。
kbs2 init
将自动生成配置文件和密钥对,并提示您输入“主”密码。
注意:默认情况下,大多数kbs2
命令将启动认证代理(kbs2 agent
),如果它尚未运行。
创建一个新的(登录)记录
$ kbs2 new amazon
? Username? jonf-bonzo
? Password? [hidden]
列出可用的记录
$ kbs2 list
amazon
facebook
从记录中提取密码
$ kbs2 pass -c amazon
# alternatively, pipeline it
$ kbs2 pass facebook | pbcopy
删除一个记录
$ kbs2 rm facebook
kbs2
的子命令功能远比上述示例展示的更多;运行每个命令时使用--help
以查看支持的全套选项。
CLI 文档
kbs2 init
用法
initialize kbs2 with a new config and keypair
USAGE:
kbs2 init [FLAGS] [OPTIONS]
FLAGS:
-f, --force overwrite the config and keyfile, if already present
-h, --help Prints help information
--insecure-not-wrapped don't wrap the keypair with a master password
OPTIONS:
-s, --store-dir <DIR> the directory to store encrypted kbs2 records in
[default: $HOME/.local/share/kbs2]
示例
创建一个新的配置和密钥对,提示用户输入主密码
$ kbs2 init
创建一个新的配置和密钥对不使用主密码
$ kbs2 init --insecure-not-wrapped
在另一个位置创建一个新的配置和密钥对
$ kbs2 -c /some/config/dir init
在另一个位置创建一个新的配置密钥对并指定非默认存储
$ kbs2 -c /home/config/dir init --store-dir /some/store/dir
kbs2 new
用法
create a new record
USAGE:
kbs2 new [FLAGS] [OPTIONS] <label>
ARGS:
<label> the record's label
FLAGS:
-f, --force overwrite, if already present
-h, --help Prints help information
-t, --terse read fields in a terse format, even when connected to a tty
OPTIONS:
-G, --generator <generator> use the given generator to generate sensitive fields
[default: default]
-k, --kind <kind> the kind of record to create [default: login]
[possible values: login, environment, unstructured]
示例
创建一个名为foobar
的新login
记录
$ kbs2 new foobar
? Username? hasdrubal
? Password? **********
创建一个名为twitter-api
的新login
记录,如果它已存在则覆盖它
$ kbs2 new -f -k environment twitter-api
? Variable? TWITTER_API
? Value? [hidden]
[Press [enter] to auto-generate]
创建一个名为pets.com
的新login
记录,使用默认生成器生成密码
$ kbs2 new pets.com
? Username? catlover1312
? Password?
[Press [enter] to auto-generate]
在密码提示中不输入任何内容将导致kbs2
使用"default"
生成器生成密码。如果您已配置了其他生成器,可以使用--generator
选项指定不同的生成器。
创建一个名为email
的新login
记录,以紧凑的格式获取字段
$ kbs2 new -t email < <(echo -e "[email protected]\x01hunter2")
在“紧凑”模式下,kbs2
期望字段由\x01
(ASCII SOH)字符分隔。
kbs2 list
用法
list records
USAGE:
kbs2 list [FLAGS] [OPTIONS]
FLAGS:
-d, --details print (non-field) details for each record
-h, --help Prints help information
OPTIONS:
-k, --kind <kind> list only records of this kind
[possible values: login, environment, unstructured]
示例
按行列出所有记录
$ kbs2 list
foobar
twitter-api
pets.com
email
列出每个记录的(非敏感)详细信息。详细列表的格式为{record} {kind} {timestamp}
。
$ kbs2 list -d
foobar login 1590277900
twitter-api environment 1590277907
pets.com login 1590277920
email login 1590277953
仅列出环境记录
$ kbs2 list -k environment
twitter-api
kbs2 rm
用法
remove one or more records
USAGE:
kbs2 rm <label>...
ARGS:
<label>... the labels of the records to remove
FLAGS:
-h, --help Prints help information
示例
删除foobar
记录
$ kbs2 rm foobar
kbs2 rename
用法
rename a record
Usage: kbs2 rename [OPTIONS] <old-label> <new-label>
Arguments:
<old-label> the record's current label
<new-label> the new record label
Options:
-f, --force overwrite, if already present
-h, --help Print help
示例
将foo
记录重命名为bar
$ kbs2 rename foo bar
将foo
重命名为bar
,即使bar
已存在
$ kbs2 rename --force foo bar
kbs2 dump
用法
dump one or more records
USAGE:
kbs2 dump [FLAGS] <label>...
ARGS:
<label>... the labels of the records to dump
FLAGS:
-h, --help Prints help information
-j, --json dump in JSON format (JSONL when multiple)
示例
导出twitter-api
记录
$ kbs2 dump twitter-api
Label twitter-api
Kind environment
Variable TWITTER_API
Value 92h2890fn83fb2378fbf283bf73fbxkfnso90
以JSON格式导出pets.com
记录
$ kbs2 dump -j pets.com | json_pp
{
"timestamp" : 1590363392,
"label" : "pets.com",
"body" : {
"fields" : {
"username" : "hasdrubal",
"password" : "hunter2"
},
"kind" : "Login"
}
}
导出多个记录,演示JSONL
$ kbs2 dump -j carthage roma
{"timestamp":1590363392,"label":"bepis","body":{"kind":"Login","fields":{"username":"hamilcar","password":"ihatecato"}}}
{"timestamp":1590363392,"label":"conk","body":{"kind":"Login","fields":{"username":"cato","password":"carthagodelendaest"}}}
kbs2 pass
用法
get the password in a login record
USAGE:
kbs2 pass [FLAGS] <label>
ARGS:
<label> the record's label
FLAGS:
-c, --clipboard copy the password to the clipboard
-h, --help Prints help information
示例
获取
pets.com记录的密码
$ kbs2 pass pets.com
hunter2
将
pets.com记录的密码复制到剪贴板
$ kbs2 pass -c pets.com
kbs2 env
用法
get an environment record
USAGE:
kbs2 env [FLAGS] <label>
ARGS:
<label> the record's label
FLAGS:
-h, --help Prints help information
-n, --no-export print only VAR=val without `export`
-v, --value-only print only the environment variable value, not the variable name
示例
以可导出形式获取环境记录
$ kbs2 env twitter-api
export TWITTER_API=92h2890fn83fb2378fbf283bf73fbxkfnso90
获取环境记录中的值
$ kbs2 env -v twitter-api
92h2890fn83fb2378fbf283bf73fbxkfnso90
kbs2 edit
用法
modify a record with a text editor
USAGE:
kbs2 edit [FLAGS] <label>
ARGS:
<label> the record's label
FLAGS:
-h, --help Prints help information
-p, --preserve-timestamp don't update the record's timestamp
示例
打开
email记录进行编辑
$ kbs2 edit email
使用自定义的
$EDITOR打开
email记录进行编辑
$ EDITOR=vim kbs2 edit email
kbs2 generate
用法
generate secret values using a generator
USAGE:
kbs2 generate [generator]
ARGS:
<generator> the generator to use [default: default]
FLAGS:
-h, --help Prints help information
示例
使用默认生成器生成密钥
$ kbs2 generate
rrayxfky-81x=h6i
使用名为
pwgen的生成器生成密钥
$ kbs2 generate pwgen
iit4wie6faeL4aiyupheec5Xochosero
kbs2 agent
用法
run the kbs2 authentication agent
USAGE:
kbs2 agent [FLAGS] [SUBCOMMAND]
FLAGS:
-F, --foreground run the agent in the foreground
-h, --help Prints help information
SUBCOMMANDS:
flush remove all unwrapped keys from the running agent
help Prints this message or the help of the given subcommand(s)
unwrap unwrap the current config's key in the running agent
示例
在后台运行
kbs2代理,提示用户解密当前配置的密钥
$ kbs2 agent
在前台运行
kbs2代理,用于调试目的
$ RUST_LOG=debug kbs2 agent --foreground
kbs2 agent flush
用法
remove all unwrapped keys from the running agent
USAGE:
kbs2 agent flush [FLAGS]
FLAGS:
-h, --help Prints help information
-q, --quit quit the agent after flushing
示例
从当前
kbs2代理中移除所有密钥
$ kbs2 agent flush
kbs2 agent query
kbs2 agent query
用法
ask the current agent whether it has the current config's key
USAGE:
kbs2 agent query
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
kbs2 agent query
通过几个离散代码退出,以表示查询状态
0
:查询成功,代理正在运行并且有配置的公钥的密钥对1
:查询失败,代理正在运行但没有查询到的密钥对2
:查询失败,代理正在运行但密钥对不是由代理管理的(即,它是未封装的密钥对)3
:查询失败,代理未运行
所有其他错误代码应视为阻止查询的未指定错误。
示例
查询当前配置的代理
$ kbs2 agent query && echo "success" || echo "failure"
查询另一个配置的密钥对
$ kbs2 -c /some/other/config agent query
kbs2 agent unwrap
用法
unwrap the current config's key in the running agent
USAGE:
kbs2 agent unwrap
FLAGS:
-h, --help Prints help information
示例
将当前配置的密钥添加到
kbs2代理
$ kbs2 agent unwrap
将自定义配置的密钥添加到
kbs2代理
$ kbs2 -c /path/to/config/dir agent unwrap
kbs2 rewrap
用法
change the master password on a wrapped key
USAGE:
kbs2 rewrap [FLAGS]
FLAGS:
-f, --force overwrite a previous backup, if one exists
-h, --help Prints help information
-n, --no-backup don't make a backup of the old wrapped key
示例
更改默认配置中封装密钥的密码
$ kbs2 rewrap
更改另一个配置中封装密钥的密码
$ kbs2 -c /path/to/config/dir rewrap
更改封装密钥的密码,不备份旧的封装密钥
$ kbs2 rewrap -n
kbs2 rekey
用法
re-encrypt the entire store with a new keypair and master password
USAGE:
kbs2 rekey [FLAGS]
FLAGS:
-h, --help Prints help information
-n, --no-backup don't make a backup of the old wrapped key, config, or store
示例
重新生成默认配置及其存储的密钥
$ kbs2 rekey
重新生成密钥,不备份原始密钥文件、配置和存储(不推荐)
$ kbs2 rekey --no-backup
重新生成不同配置和存储的密钥
$ kbs2 -c /some/other/kbs2/conf/dir rekey
kbs2 config
用法
interact with kbs2's configuration file
USAGE:
kbs2 config <SUBCOMMAND>
OPTIONS:
-h, --help Print help information
SUBCOMMANDS:
dump dump the active configuration file as JSON
help Print this message or the help of the given subcommand(s)
kbs2 config dump
用法
dump the active configuration file as JSON
USAGE:
kbs2 config dump [OPTIONS]
OPTIONS:
-h, --help Print help information
-p, --pretty pretty-print the JSON
示例
将当前配置以JSON格式导出
$ kbs2 config dump
# pretty-print the dumped JSON
$ kbs2 config dump --pretty
配置
kbs2
将配置存储在
<config dir>/kbs2/config.toml,其中
<config dir>由XDG basedir规范确定。在Linux上,它可能是
~/.config/kbs2。
注意:如果配置目录中没有找到
config.toml,
kbs2将尝试在相同目录中使用
kbs2.conf。这是为了向后兼容,一旦
kbs2发布第一个稳定版本,将被移除。
config.toml是TOML格式的,使用
kbs2 init干净启动后可能看起来像这样
public-key = "age1elujxyndwy0n9j2e2elmk9ns8vtltg69q620dr0sz4nu5fgj95xsl2peea"
keyfile = "/home/william/.config/kbs2/key"
store = "/home/william/.local/share/kbs2"
[commands.pass]
clipboard-duration = 10
clear-after = true
public-key(默认:由
kbs2 init生成)
public-key设置记录了
kbs2使用的age密钥对的公钥部分。
kbs2 init预先填充此设置;用户不应修改它,除非同时修改
keyfile设置(例如,指向现有的age密钥对)。
keyfile(默认:由
kbs2 init生成)
keyfile设置记录了
kbs2使用的age密钥对的私钥部分的路径。
kbs2 init
会预先填充此设置;用户应 不要 修改它,除非也修改 public-key
设置(例如,指向现有的密钥对)。
agent-autostart
(默认:true
)
agent-autostart
设置控制当请求加密或解密操作时,kbs2
是否尝试自动启动身份验证代理(kbs2 agent
)。默认情况下,如果 kbs2 agent
未运行,它将被启动。
当设置为 false
时,如果 kbs2 agent
未运行,kbs2
将报告错误。在这种情况下,用户应配置系统在登录时(或其它方便的时间)启动 kbs2 agent
。
wrapped
(默认:true
)
wrapped
设置记录 keyfile
是否为“包装”的私钥,即私钥本身是否使用主密码加密。
默认情况下,kbs2 init
会提示用户输入主密码并创建一个包装密钥。有关更多信息,请参阅 kbs2 init
文档。
store
(默认:$HOME/.local/share/kbs2
)
store
设置记录了密钥库的路径,即记录的保存位置。
用户可以修改此设置以将记录保存在自定义目录中。
pinentry
(默认:"pinentry"
)
pinentry
设置指定用于密码操作的 Pinentry 二进制文件(即提示用户输入主密码)。
pinentry
对于大多数系统来说是合理的默认值;macOS 用户可能希望使用 pinentry-mac
。
pre-hook
(默认:None
)
可以使用 pre-hook
设置在每次(几乎)调用 kbs2
之前运行一个命令。
目前有三种情况配置的 pre-hook
将 不会 运行:
kbs2
(即没有子命令)kbs2 agent
(以及所有kbs2 agent
子命令)kbs2 init
所有其他子命令,包括自定义子命令,都将导致配置的 pre-hook
运行。
请参阅 Hooks 文档以获取更多详细信息。
post-hook
(默认:None
)
可以使用 post-hook
设置在每次(几乎)调用 kbs2
之后,成功 时运行一个命令。
目前有三种情况配置的 post-hook
将 不会 运行:
kbs2
(即没有子命令)kbs2 agent
(以及所有kbs2 agent
子命令)kbs2 init
所有其他子命令,包括自定义子命令,都将导致配置的 post-hook
运行。
请参阅 Hooks 文档以获取更多详细信息。
error-hook
(默认:None
)
可以使用 error-hook
设置在每次(几乎)调用 kbs2
之后,失败 时运行一个命令。
当前有三种情况,配置的 error-hook
不会运行。
kbs2
(即没有子命令)kbs2 agent
(以及所有kbs2 agent
子命令)kbs2 init
所有其他子命令,包括自定义子命令,都会导致配置的 error-hook
运行。
error-hook
设置将一个参数传递给其钩子,该参数是错误发生的字符串表示形式。
请参阅 Hooks 文档以获取更多详细信息。
reentrant-hooks
(默认:false
)
reentrant-hooks
设置控制当钩子本身运行 kbs2
时,钩子是否会多次运行。默认情况下,钩子只在初始 kbs2
调用中运行。
commands.new.default-username
(默认:None
)
commands.new.default-username
设置允许用户指定使用 kbs2 new
创建的登录的默认用户名。
当指定时,当用户只按 [enter]
时,kbs2 new
的用户名提示将填充默认值。
commands.new.pre-hook
(默认:None
)
commands.new.pre-hook
设置类似于全局 pre-hook
设置,但它会在 kbs2 new
(以及 仅 kbs2 new
)记录创建之前立即运行。
commands.new.post-hook
(默认:None
)
commands.new.post-hook
设置类似于全局 post-hook
设置,但它会在 kbs2 new
(以及 仅 kbs2 new
)记录创建之后立即运行。
commands.new.post-hook
设置将单个参数传递给其钩子,该参数是刚刚创建的记录的标签。例如,以下
[commands.new]
post-hook = "~/.config/kbs2/hooks/post-new.sh"
# ~/.config/kbs2/hooks/post-new.sh
>&2 echo "[+] created ${1}"
将产生
$ kbs2 new foo
? Username? bar
? Password? **********
[+] created foo
commands.pass.clipboard-duration
(默认:10
)
commands.pass.clipboard-duration
设置确定通过 kbs2 pass -c
存储在剪贴板中的密码的持续时长(以秒为单位)。
commands.pass.clear-after
(默认:true
)
commands.pass.clear-after
设置确定是否在 kbs2 pass -c
之后清除剪贴板。
将此设置为 false
将覆盖在 commands.pass.clipboard-duration
中配置的任何持续时间。
commands.pass.pre-hook
(默认: None
)
command.pass.pre-hook
设置类似于全局 pre-hook
设置,但它在 kbs2 pass
(以及 仅 kbs2 pass
) 期间记录访问之前立即运行。
command.pass.post-hook
(默认: None
)
command.pass.post-hook
设置类似于全局 post-hook
设置,但它在 kbs2 pass
(以及 仅 kbs2 pass
) 期间记录访问之后立即运行。
command.pass.clear-hook
(默认: None
)
command.pass.clear-hook
与其他 command.pass
钩子类似,但它在从剪贴板清除密码后运行。
commands.edit.editor
(默认: None
)
commands.edit.editor
设置控制使用 kbs2 edit
打开文件时使用的编辑器。此设置优先于用作回退的 $EDITOR
环境变量。
此设置可以包含标志。例如,以下将被正确分割
[commands.edit]
editor = "subl -w"
commands.edit.post-hook
(默认: None
)
command.edit.post-hook
设置类似于全局 post-hook
设置,但它在 kbs2 edit
(以及 仅 kbs2 edit
) 期间记录编辑之后立即运行。
commands.rm.post-hook
(默认: None
)
command.rm.post-hook
设置类似于全局 post-hook
设置,但它在 kbs2 rm
(以及 仅 kbs2 rm
) 期间记录删除之后立即运行。
kbs2 rm
删除的每个记录的标签都将作为单独的参数传递给 post-hook
。
commands.rename.post-hook
(默认: None
)
《command.rename.post-hook
》设置类似于全局的《post-hook
》设置,但它在执行《kbs2 rename
》(仅限《kbs2 rename
》)操作后立即运行,并在记录删除时执行。
记录的旧名称和新名称按顺序作为单独的参数传递给《post-hook
》。
生成器
kbs2
支持用于生成敏感值的《em>生成器》,允许用户自动生成密码和环境变量。
生成器配置为《[[generators]]
》中的条目。
以下配置了一个名为“hexonly”的生成器,该生成器从配置的字母表和长度生成秘密。
[[generators]]
name = "hexonly"
alphabets = ["0123456789abcdef"]
length = 16
默认情况下,kbs2
的配置包括一个名为default
的生成器,其外观类似于以下内容
[[generators]]
name = "default"
# kbs2 samples from each alphabet, to ensure a good distribution of symbols
alphabets = [
"abcdefghijklmnopqrstuvwxyz",
"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
"0123456789",
"(){}[]-_+=",
]
length = 16
这些生成器可以与kbs2 new
一起使用。例如,以下操作将在用户按下[enter]
时使用hexonly
生成器,而不是手动输入密码。
$ kbs2 new -G hexonly pets.com
? Username? catlover2000
? Password?
[Press [enter] to auto-generate]
定制
除了上述配置之外,kbs2
还提供了一些定制化途径。
自定义命令
kbs2
支持类似《git
》风格的子命令,允许您轻松编写自己的子命令。
例如,执行以下命令
$ kbs2 frobulate --xyz
将导致kbs2
执行kbs2-frobulate --xyz
。允许自定义命令在《[commands.ext.<name>]
层次结构下读取和写入配置文件。
当通过kbs2
运行时,自定义命令将接收以下环境变量
KBS2_CONFIG_DIR
:加载kbs2
自身的配置目录的路径。子命令可以使用此路径读取当前配置文件或配置目录中存储的任何其他内容。- 注意:建议子命令使用
kbs2 config dump
读取配置状态,而不是手动尝试找到正确的文件。
- 注意:建议子命令使用
KBS2_STORE
:秘密存储的路径。KBS2_SUBCOMMAND
:始终设置为1
。这可以用来确定子命令是通过kbs2
(例如,kbs2 foo
)还是直接(例如,kbs2-foo
)运行的。KBS2_MAJOR_VERSION
、KBS2_MINOR_VERSION
、KBS2_PATCH_VERSION
:执行此子命令的kbs2
版本的次要、次要和补丁号。子命令可以使用这些数字来强制在最小(或最大)版本的kbs2
下运行。
《contrib/ext-cmds》目录包含几个有用的外部命令。
钩子
kbs2
在调用生命周期中公开了钩子点,允许用户注入额外功能或执行自己的会计工作。
钩子API
所有钩子,无论是预钩子还是后钩子,都具有以下行为
- 钩子不会从父进程
stdin
或stdout
继承 - 钩子从父进程中继承
stderr
,并且可以使用它来打印任何它们想打印的内容。 - 钩子始终在
store
目录下运行。 - 钩子以环境变量
KBS2_HOOK=1
运行,并且将KBS2_CONFIG_DIR
设置为原始kbs2
命令加载的配置目录。 - 钩子的错误退出(或执行失败)会导致整个
kbs2
命令失败。
只要不与上述内容冲突,钩子可以引入额外的行为。任何额外的钩子行为都在该钩子的配置设置中进行说明。
可重入性
kbs2
的钩子默认不可重入。
要理解这意味着什么,想象以下钩子设置
pre-hook = "~/.config/kbs2/hooks/pre.sh"
# ~/.config/kbs2/hooks/pre.sh
kbs2 some-other-command
然后
$ kbs2 list
在这个设置中,大多数用户会期望 pre.sh
只运行一次:在 kbs2 list
上。
然而,天真地,它应该执行两次:一次为 kbs2 list
,再次为 kbs2 some-other-command
。换句话说,天真地,钩子会在使用 kbs2
的内部时重复执行。
大多数用户认为这很令人困惑,并将其视为钩子编写的障碍,因此 kbs2
默认不会这样做。然而,如果您希望有可重入的钩子,您有两个选择
- 您可以在配置中设置
reentrant-hooks
为true
。这将使所有钩子都变得可重入——这是一个全有或全无的选择,故意为之。 - 您可以在运行
kbs2
内部之前,通过unset
或其他方式删除钩子中的KBS2_HOOK
环境变量。这允许您控制哪些钩子导致可重入性。**请注意**:KBS2_HOOK
是一个实现细节!自行承担风险!
管理您的密钥和主密码
重新包装和重新加密
kbs2
支持两种管理(包装)加密秘密存储中所有记录的密钥的基本选项:重新包装和重新加密。
重新包装 意味着更改包装密钥的密码。重新包装 不会 修改底层密钥本身,这意味着存储中的单个记录 不会 改变。重新包装使用 kbs2 rewrap
命令完成。
您应该在以下(非详尽)条件下重新包装
- 您正在执行主密码的常规更新
- 您认为您的密码已经泄露,但 没有 底层包装密钥泄露
重新加密 意味着更改包装密钥本身,并相应地使用新的包装密钥重新加密每个记录。在重新加密时,您可以选择与旧密钥相同的密码作为新密钥。然而,您应该选择一个新的密码。与重新包装不同,重新加密会更改存储中的单个记录,并使它们无法使用之前的密钥解密。重新加密使用 kbs2 rekey
命令完成。
您应该在以下(非详尽)条件下重新加密
- 您认为您的底层包装密钥已经泄露
- 您正在将
kbs2
分享到新设备,并且希望该设备有它自己的包装密钥
重新加密操作比重新封装操作更剧烈:它涉及到重新编写密钥对、kbs2
配置以及存储中的每个记录。这意味着它带来了一些技术注意事项
-
kbs2 rekey
不会保留配置文件的布局。用户在重新加密时应注意这一点。 -
kbs2 rekey
通过将存储中的每个记录复制到一个备份文件夹来备份秘密存储。秘密存储中除记录之外的内容(如元数据或版本控制目录,或隐藏文件)在备份过程中不会被复制。重新加密导致kbs2
将新加密的记录写入相同的存储,因此存储中的任何非记录成员将保持不变。
为什么还需要另一个密码管理器?
没有好理由。见历史部分。
技术细节
威胁模型
kbs2
的威胁模型类似于大多数密码和秘密管理器的威胁模型。特别是
kbs2
不 尝试防御root
用户 或 当前用户执行的任意代码。kbs2
努力避免可能导致秘密材料(即私钥和记录的解密内容)被保存在磁盘上或缓存的操作,但 不 尝试阻止秘密材料的消费者这样做。kbs2
默认尝试通过使用主密码对静态私钥进行加密来防止离线私钥提取。kbs2
不 尝试防止用户错误处理他们的主密码。
密码学
kbs2
不 在其自身上实现任何密码学——它 仅 使用由 age 实现提供的密码学原语。特别是,kbs2
使用 rage 实现的 age。
kbs2
的密码学使用细节如下
- 每个
kbs2
配置文件指定一个对称密钥对。公钥存储在public-key
配置设置中,而私钥存储在keyfile
设置引用的文件中。 - 默认情况下,
kbs2
使用主密码对私钥进行“封装”(即加密)。这使得离线密钥提取攻击更困难(尽管不是不可能),并且使得封装私钥泄露的后果不那么严重。用户 可以 通过将--insecure-not-wrapped
传递给kbs2 init
来选择使用非封装密钥。
密钥解封装和持久化
如果没有持久化,封装密钥的使用将会很麻烦:用户必须在每次执行 kbs2
动作时重新输入主密码,这违背了拥有秘密管理器的目的。
为了避免这种情况,kbs2
通过认证代理建立解封装密钥的持久性:运行 kbs2 agent
将在后台启动一个守护程序,后续的 kbs2
调用可以通过 Unix 域套接字连接到它(如有需要)。默认情况下,运行 kbs2 agent
将提示用户输入当前配置密钥的主密码。用户可以通过调用 kbs2 agent unwrap
将更多未封装密钥添加到其运行的代理中。
黑客攻击
在 kbs2
上进行黑客攻击相对简单。要构建一个功能齐全的开发副本,只需在存储库根目录中使用 cargo build
$ cargo build
$ ./target/debug/kbs2 --help
注意事项:age crate 中的某些功能在调试构建中表现异常,特别是在解密和密钥解包方面,已知速度特别慢。
为了避免这个问题,请使用发布构建。
$ cargo build --release
$ ./target/release/kbs2 --help
日志记录
kbs2
使用 log
和 env_logger
进行日志记录。您可以在环境中输入 RUST_LOG=debug
来启用调试日志。
$ RUST_LOG=debug ./target/release/kbs2 list -k login
有关更多可能的 RUST_LOG
值,请参阅 env_logger
文档。
历史
总结:kbs2
是 "KBSecret 2" 的简称。
2017年,我编写了 KBSecret 作为 Keybase 生态系统的一般用途密钥管理器。
KBSecret 使用 Ruby 编写,并利用 Keybase + KBFS 进行加密、存储和同步。它也非常灵活,允许用户定义记录类型、用户和团队之间的密钥共享,以及方便且表现良好的 CLI 工具,以便集成到我的开发生态系统中。
不幸的是,KBSecret 也非常慢:它使用 令人烦恼的元编程 Ruby 编写,严重依赖于可重入的 CLI,并且受到 KBFS 本身的延迟和原始性能的限制。
对于我的用途,拥有一个慢速的密钥管理器是可以的,但我 不再信任 Keybase(和 KBFS)将继续获得它们所需的工作。我也再也没有时间维护 KBSecret 的(缓慢)恶化的代码库。
kbs2
是我试图在更快的语言中重现 KBSecret 的最佳部分。除了名称和一些高级设计决策外,它与原始 KBSecret 没有共同之处。它之所以命名为 kbs2
,是因为我已经习惯了在我的终端中输入 "kbs"。
依赖项
~20–34MB
~493K SLoC