#key-value #key-value-store #key #value #private-key #encryption #server-client

bin+lib key_value_service

一个令人耳目一新的简单数据驱动游戏引擎和应用框架

11 个版本

0.1.10 2022年9月22日
0.1.9 2022年3月24日

#43 in #server-client

Apache-2.0

68KB
1.5K SLoC

KVS

Key Value Services 是一个 cli 工具,帮助你创建键值存储服务。

动机

我想创建一个内容共享工具,这个工具只能由一个人管理,在安全的网络环境中可以被许多人阅读,这样我就可以在终端中使用一些常用内容。

安装

cargo install key_value_service

警告

此项目仍处于开发初期,仅用作开发工具。请勿在生产环境中用于数据存储。如果您有此类要求,建议您使用 redis。一些 API 将会不经通知进行破坏性更改。

用法

  1. 在服务器上启动 kvs
> kvs start
2022-03-18T15:59:26.503861Z  INFO starting with 0.0.0.0:8888 successfully!
  1. 从客户端登录 kvs 服务
> kvs -r 0.0.0.0:8888 login
2022-03-18T16:05:05.022305Z  INFO Token: FAAAAAAAAACUH40t6d+A9jzhexGHktUINvWwL317xp1/AQAAFAAAAAAAAACrtlLcjeSqhMZCj5rnNn2hkf0K/w==
2022-03-18T16:05:05.022393Z  INFO Save Token file to: .kvs/token
  1. 创建一个私有密钥值
> kvs create foo "hello world"

默认情况下,kvs 将使用您本地的 priv_key 对值进行加密。远程端仅判断密钥的所有者。解密过程需要由客户端自行完成。

  1. 读取一个键
> kvs read foo
hello world
  1. 创建一个公开密钥值
> kvs create priv_foo "priv hello world" -p

如果您仅这样做,kvs 将发送值并将值以明文形式保存在远程端。

  1. 读取一个私有密钥
> kvs cat priv_foo
priv hello world
  1. 删除一个键
> kvs delete priv_foo

您只能删除属于您自己的键。

  1. 更新一个键
kvs create priv_foo "this is change data"
kvs read priv_foo
this is change data
  1. 显示远程信息
> kvs remote
0.1.3
  1. 显示本地信息
> kvs local
scope: 0x4d7153428dd617a410f114468d212a9cd1b7ccd0
pub: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD9qWAweIhnLfBdjYj8oty1z2FYycQ8qhebrDLCQBJPTF1IfV282WCHET7Fsjd1C9+XMbW2xT0f73cZgSExgILeGjZFlx9gEf5VVJyBezfQ6yU2V9Emo58zRh6fjfoBGUsXmVIJIGCpnVjHg/ECEVKuDVQ3h0SEHrdxE98bSl9RIQIDAQAB
  1. 读取其他作用域的键
> kvs read -s 0xad359ae3e478342ed2b5512ed7ff4ebb3ceb2dd test_pub
pub content
  1. 重启 kvs 服务器
> kvs restart
  1. 停止 kvs 服务器
> kvs stop
  1. 删除所有键
> kvs list | awk -F '\t' '{print "kvs delete " $2}' | bash

示例

案例1:同步一个团队的信息

您的团队有一个庞大的资源 ID 列表。

# important_resource_id.txt
...
A7EB0B7B-3E27-4531-B239-750300EE8D0C
B9164246-49E3-45F1-A8CE-D871CEBE3971
92312D9B-B2D8-4A92-B7B5-9A5491FF9BEC
8E1B24ED-0023-45E0-BF34-1548C8D8884D
...

有时,团队成员需要根据这个大列表创建 URL。

# important_resource_urls.txt
...
http://xxx.xxx.xxx.xxx/app/goods/A7EB0B7B-3E27-4531-B239-750300EE8D0C
http://xxx.xxx.xxx.xxx/app/goods/B9164246-49E3-45F1-A8CE-D871CEBE3971
http://xxx.xxx.xxx.xxx/app/goods/92312D9B-B2D8-4A92-B7B5-9A5491FF9BEC
http://xxx.xxx.xxx.xxx/app/goods/8E1B24ED-0023-45E0-BF34-1548C8D8884D
...

假设我们已经编写了一个名为 transform 的命令行工具来处理这种情况。

cat important_resource_urls.txt | transform

问题是,我如何与其他团队成员共享 important_resource_urls.txt

当然,有很多方法可以共享它。但如果你使用 kvs,你可以快速完成它。

# create the key
kvs create important_resource_urls -f important_resource_urls.txt

# and then, other team member can use it.
kvs read important_resource_urls | transform

案例1:公开同步信息

curl https://xxx/a.json | json "important" | kvs create important -f -p
kvs read important -s your_scope

案例2:证明自己的身份

您可以将您的 pub key 追踪到某些网站上。

> kvs local
scope: 0x4d7153428dd617a410f114468d212a9cd1b7ccd0
pub: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD9qWAweIhnLfBdjYj8oty1z2FYycQ8qhebrDLCQBJPTF1IfV282WCHET7Fsjd1C9+XMbW2xT0f73cZgSExgILeGjZFlx9gEf5VVJyBezfQ6yU2V9Emo58zRh6fjfoBGUsXmVIJIGCpnVjHg/ECEVKuDVQ3h0SEHrdxE98bSl9RIQIDAQAB

网站会追踪您的一个密文。

website: (your pub key) + (random value) -> (cipher text)

现在您可以使用 kvs de 命令来解密(密文)

> kvs de (cipher text)
(random value)

将(随机值)追踪到网站上。您将向网站证明自己的身份。

路线图

社区

  • 添加 sync 命令以同步一个目录中的所有文件,并使用相对目录作为键。

  • 添加 list 命令以列出您范围内的所有键元。

  • 添加 restart 命令以重新启动服务器。

  • 添加 stop 命令以停止服务器。

  • 添加 setget 命令以在客户端本地配置一些值。

  • 添加 set 命令以设置客户端本地的配置。

  • 在创建和上传命令中添加 --file 选项。

  • sync 命令中添加相同的选项,类似于 createupdate

  • kvs local 中附加显示公钥。

  • 添加 kvs de 命令以解密某些内容。默认使用本地私钥。

  • 添加 kvs en 命令以加密某些内容。默认使用本地公钥。

  • 在读取中移除 --scope 选项,您可以使用 kvs read your_scope:some_key 来读取公钥。

  • 添加 kvs set whitelist 命令来设置白名单。

  • 添加 kvs search 命令以在不同的存储库中搜索某些内容。

  • 修复创建和上传命令中的 --file 选项,可以不提供文件名,如果这样做,kvs 将使用标准输入的内容作为值。

  • 添加服务器配置以配置存储后端。

  • 添加单元测试和文档。

  • 添加 GitHub Action 以发布二进制文件。

  • 重构 Remote Action 模型。

  • 重构 aes session 以成为 aes stream

  • 配置 Docker 容器。

  • ``

商业

  • 在共享密钥过程中添加 P2P。
  • 构建一个免费的中央存储节点。
  • 添加 upgrade 命令以同步远程 kvs 命令行到客户端本地。

依赖关系

~16–26MB
~374K SLoC