73 个版本

0.7.3-rc.12023 年 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 加密学

Download history 1/week @ 2024-03-08 2/week @ 2024-03-15 190/week @ 2024-03-29 75/week @ 2024-04-05

143 每月下载次数

MIT 许可证

165KB
2.5K SLoC

kbs2

CI Crates.io Packaging status

警告!kbs2 是测试版质量的软件!使用 kbs2 意味着您可能随时会丢失或泄露秘密!

kbs2 是一个用于管理 秘密 的命令行工具。

快速链接

安装

软件包

kbs2 可通过多种官方和社区提供的软件包获取。

请参阅下面的矩阵,以获取包含 kbs2 的存储库列表。

Packaging status

如果您不是在开发它,这些软件包是推荐安装 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

用法

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_VERSIONKBS2_MINOR_VERSIONKBS2_PATCH_VERSION:执行此子命令的kbs2版本的次要、次要和补丁号。子命令可以使用这些数字来强制在最小(或最大)版本的kbs2下运行。

contrib/ext-cmds》目录包含几个有用的外部命令。

钩子

kbs2在调用生命周期中公开了钩子点,允许用户注入额外功能或执行自己的会计工作。

钩子API

所有钩子,无论是预钩子还是后钩子,都具有以下行为

  • 钩子不会从父进程stdinstdout继承
  • 钩子从父进程中继承 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-hookstrue。这将使所有钩子都变得可重入——这是一个全有或全无的选择,故意为之。
  • 您可以在运行 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 通过认证代理建立解封装密钥的持久性:运行 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 使用 logenv_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