Skip to content

Commit 7299905

Browse files
committed
Feat: 重构key命令
1 parent 5c019b3 commit 7299905

5 files changed

Lines changed: 133 additions & 91 deletions

File tree

README.md

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@ Available Commands:
2929
completion Generate the autocompletion script for the specified shell
3030
decrypt Decrypt a Base64 string with a work key
3131
encrypt Encrypt a string with a work key
32+
gen-random-key Generate a random key file
33+
gen-root-key Generate root key files
34+
gen-work-key Generate a work key file
3235
help Help about any command
33-
key-gen Generate root/work/random key files
3436
3537
Flags:
3638
-c, --check Check cmd run conditions
@@ -39,20 +41,48 @@ Flags:
3941
Use "tools [command] --help" for more information about a command.
4042
```
4143

42-
### tools key-gen --help 输出
44+
### tools gen-root-key --help 输出
4345

4446
```text
45-
Generate root keys (rootKey/root_part_*.key + rootKey/root.salt), a work key encrypted by the root key, or a random key file.
47+
Generate root keys (rootKey/root_part_*.key + rootKey/root.salt).
4648
4749
Usage:
48-
tools key-gen [flags]
50+
tools gen-root-key [flags]
4951
5052
Flags:
51-
-d, --dir string Key base directory. Will create rootKey/workKey under it.
53+
-d, --dir string Key base directory. Will create rootKey/workKey under it.
5254
-f, --force Force Create RootKey, Ignore Exist key.
53-
-h, --help help for key-gen
55+
-h, --help help for gen-root-key
56+
```
57+
58+
### tools gen-work-key --help 输出
59+
60+
```text
61+
Generate a work key encrypted by the root key.
62+
63+
Usage:
64+
tools gen-work-key [flags]
65+
66+
Flags:
67+
-d, --dir string Key base directory. Will create rootKey/workKey under it.
68+
-f, --force Force Create WorkKey, Ignore Exist key.
69+
-h, --help help for gen-work-key
5470
-n, --name string Work Key File Name. eg: work.key (default "work.key")
55-
-t, --type string Key Type: root, work, random.
71+
```
72+
73+
### tools gen-random-key --help 输出
74+
75+
```text
76+
Generate a random key file (Base64, 32 bytes) in workKey directory.
77+
78+
Usage:
79+
tools gen-random-key [flags]
80+
81+
Flags:
82+
-d, --dir string Key base directory. Will create rootKey/workKey under it.
83+
-f, --force Force Create RandomKey, Ignore Exist key.
84+
-h, --help help for gen-random-key
85+
-n, --name string Random Key File Name. eg: random.key (default "random.key")
5686
```
5787

5888
### tools encrypt --help 输出
@@ -87,59 +117,57 @@ Flags:
87117
生成根密钥与盐文件,会在 `rootKey/` 目录产生 `root_part_1.key``root_part_2.key``root.salt`
88118

89119
```bash
90-
./tools key-gen --type root
120+
./tools gen-root-key
91121
```
92122

93-
注意:`--type` 为必填参数。
94-
95123
如需强制覆盖已有文件:
96124

97125
```bash
98-
./tools key-gen --type root --force
126+
./tools gen-root-key --force
99127
```
100128

101129
指定自定义密钥目录(会在目录下创建 `rootKey/``workKey/`):
102130

103131
```bash
104-
./tools key-gen --type root --dir /tmp/keys
132+
./tools gen-root-key --dir /tmp/keys
105133
```
106134

107135
### 2) 生成工作密钥(work key)
108136
工作密钥会生成在 `workKey/` 目录下,并使用 root key 进行加密存储。
109137

110138
```bash
111-
./tools key-gen --type work --name work.key
139+
./tools gen-work-key --name work.key
112140
```
113141

114142
强制重建指定工作密钥:
115143

116144
```bash
117-
./tools key-gen --type work --name work.key --force
145+
./tools gen-work-key --name work.key --force
118146
```
119147

120148
指定自定义密钥目录:
121149

122150
```bash
123-
./tools key-gen --type work --name work.key --dir /tmp/keys
151+
./tools gen-work-key --name work.key --dir /tmp/keys
124152
```
125153

126154
### 3) 生成随机密钥文件(random key file)
127155
随机密钥文件会生成在 `workKey/` 目录下,文件内容是一个 Base64 编码的随机密钥(长度 32 字节)。
128156

129157
```bash
130-
./tools key-gen --type random --name random.key
158+
./tools gen-random-key --name random.key
131159
```
132160

133161
强制重建指定随机密钥文件:
134162

135163
```bash
136-
./tools key-gen --type random --name random.key --force
164+
./tools gen-random-key --name random.key --force
137165
```
138166

139167
指定自定义密钥目录:
140168

141169
```bash
142-
./tools key-gen --type random --name random.key --dir /tmp/keys
170+
./tools gen-random-key --name random.key --dir /tmp/keys
143171
```
144172

145173
### 4) 加密输入字符串
@@ -172,10 +200,10 @@ Flags:
172200

173201
```bash
174202
# 1. 生成 root key 与 salt(在自定义目录下的 rootKey/)
175-
./tools key-gen --type root --dir /tmp/keys
203+
./tools gen-root-key --dir /tmp/keys
176204

177205
# 2. 生成工作密钥(在自定义目录下的 workKey/)
178-
./tools key-gen --type work --name work.key --dir /tmp/keys
206+
./tools gen-work-key --name work.key --dir /tmp/keys
179207

180208
# 3. 加密字符串(输出 Base64)
181209
cipher=$(./tools encrypt --work-key work.key --key-dir /tmp/keys "hello-world")
@@ -210,7 +238,7 @@ Create Work Key: work.key Done
210238
## 目录结构(核心部分)
211239

212240
- `main.go`:入口与命令注册
213-
- `keys/`:key-gen 命令实现(参数解析与调用)
241+
- `keys/`gen-root-key / gen-work-key / gen-random-key 命令实现(参数解析与调用)
214242
- `encrypt/`:字符串加密命令
215243
- `common/`:加密、密钥生成/读取与路径等通用逻辑
216244

Version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.0.5
1+
1.1.0

keys/cmd.go

Lines changed: 78 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -10,82 +10,94 @@ import (
1010
"github.com/spf13/cobra"
1111
)
1212

13-
// createKeysCmd represents the createKeys command
14-
var cmd = &cobra.Command{
15-
Use: "key-gen",
16-
Short: "Generate root/work/random key files",
17-
Long: "Generate root keys (rootKey/root_part_*.key + rootKey/root.salt), a work key encrypted by the root key, or a random key file.",
18-
RunE: runCmd,
19-
}
20-
21-
var keyType string
2213
var forceFlag bool
2314
var workKeyFile string
2415
var keyBaseDir string
2516

26-
func init() {
27-
cmd.Flags().StringVarP(&keyType, "type", "t", "", "Key Type: root, work, random.")
28-
cmd.Flags().StringVarP(&workKeyFile, "name", "n", "work.key", "Work Key File Name. eg: work.key")
29-
cmd.Flags().StringVarP(&keyBaseDir, "dir", "d", "", "Key base directory. Will create rootKey/workKey under it.")
30-
cmd.Flags().BoolVarP(&forceFlag, "force", "f", false, "Force Create RootKey, Ignore Exist key.")
31-
if err := cmd.MarkFlagRequired("type"); err != nil {
32-
panic(err)
17+
func GetCmds() []*cobra.Command {
18+
return []*cobra.Command{
19+
newGenRootKeyCmd(),
20+
newGenWorkKeyCmd(),
21+
newGenRandomKeyCmd(),
3322
}
3423
}
3524

36-
func GetCmd() *cobra.Command {
37-
return cmd
25+
func applyBaseFlags(cmd *cobra.Command) {
26+
cmd.Flags().StringVarP(&keyBaseDir, "dir", "d", "", "Key base directory. Will create rootKey/workKey under it.")
3827
}
3928

40-
func runCmd(cmd *cobra.Command, args []string) error {
41-
if keyType == "" {
42-
return fmt.Errorf("type is required")
29+
func newGenRootKeyCmd() *cobra.Command {
30+
rootCmd := &cobra.Command{
31+
Use: "gen-root-key",
32+
Short: "Generate root key files",
33+
Long: "Generate root keys (rootKey/root_part_*.key + rootKey/root.salt).",
34+
RunE: func(cmd *cobra.Command, args []string) error {
35+
common.SetKeyBaseDir(keyBaseDir)
36+
if forceFlag {
37+
common.ClearAllKeys()
38+
}
39+
if err := common.CreateRootKeySalt(); err != nil {
40+
return err
41+
}
42+
fmt.Println("Create Root Key Salt Done")
43+
if err := common.CreateRootKeyParts(); err != nil {
44+
return err
45+
}
46+
fmt.Println("Create Root Key Done")
47+
return nil
48+
},
4349
}
44-
common.SetKeyBaseDir(keyBaseDir)
45-
switch keyType {
46-
case "root":
47-
if forceFlag {
48-
common.ClearAllKeys()
49-
}
50-
err := common.CreateRootKeySalt()
51-
if err != nil {
52-
return err
53-
}
54-
fmt.Println("Create Root Key Salt Done")
55-
err = common.CreateRootKeyParts()
56-
if err != nil {
57-
return err
58-
}
59-
fmt.Println("Create Root Key Done")
60-
case "work":
61-
var err error
62-
if forceFlag {
63-
err = common.ClearWorkKey(workKeyFile)
64-
}
65-
if err != nil {
66-
return err
67-
}
68-
err = common.CreateWorkKey(workKeyFile)
69-
if err != nil {
70-
return err
71-
}
72-
fmt.Printf("Create Work Key: %s Done\n", workKeyFile)
73-
case "random":
74-
var err error
75-
if forceFlag {
76-
err = common.ClearWorkKey(workKeyFile)
77-
}
78-
if err != nil {
79-
return err
80-
}
81-
err = common.CreateRandomKeyFile(workKeyFile)
82-
if err != nil {
83-
return err
84-
}
85-
fmt.Printf("Create Random Key File: %s Done\n", workKeyFile)
86-
default:
87-
return fmt.Errorf("unknown type: %s", keyType)
50+
applyBaseFlags(rootCmd)
51+
rootCmd.Flags().BoolVarP(&forceFlag, "force", "f", false, "Force Create RootKey, Ignore Exist key.")
52+
return rootCmd
53+
}
54+
55+
func newGenWorkKeyCmd() *cobra.Command {
56+
workCmd := &cobra.Command{
57+
Use: "gen-work-key",
58+
Short: "Generate a work key file",
59+
Long: "Generate a work key encrypted by the root key.",
60+
RunE: func(cmd *cobra.Command, args []string) error {
61+
common.SetKeyBaseDir(keyBaseDir)
62+
if forceFlag {
63+
if err := common.ClearWorkKey(workKeyFile); err != nil {
64+
return err
65+
}
66+
}
67+
if err := common.CreateWorkKey(workKeyFile); err != nil {
68+
return err
69+
}
70+
fmt.Printf("Create Work Key: %s Done\n", workKeyFile)
71+
return nil
72+
},
8873
}
74+
applyBaseFlags(workCmd)
75+
workCmd.Flags().StringVarP(&workKeyFile, "name", "n", "work.key", "Work Key File Name. eg: work.key")
76+
workCmd.Flags().BoolVarP(&forceFlag, "force", "f", false, "Force Create WorkKey, Ignore Exist key.")
77+
return workCmd
78+
}
8979

90-
return nil
80+
func newGenRandomKeyCmd() *cobra.Command {
81+
randomCmd := &cobra.Command{
82+
Use: "gen-random-key",
83+
Short: "Generate a random key file",
84+
Long: "Generate a random key file (Base64, 32 bytes) in workKey directory.",
85+
RunE: func(cmd *cobra.Command, args []string) error {
86+
common.SetKeyBaseDir(keyBaseDir)
87+
if forceFlag {
88+
if err := common.ClearWorkKey(workKeyFile); err != nil {
89+
return err
90+
}
91+
}
92+
if err := common.CreateRandomKeyFile(workKeyFile); err != nil {
93+
return err
94+
}
95+
fmt.Printf("Create Random Key File: %s Done\n", workKeyFile)
96+
return nil
97+
},
98+
}
99+
applyBaseFlags(randomCmd)
100+
randomCmd.Flags().StringVarP(&workKeyFile, "name", "n", "random.key", "Random Key File Name. eg: random.key")
101+
randomCmd.Flags().BoolVarP(&forceFlag, "force", "f", false, "Force Create RandomKey, Ignore Exist key.")
102+
return randomCmd
91103
}

main.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ var rootCmd = &cobra.Command{
1919
}
2020

2121
func setCmds() {
22-
rootCmd.AddCommand(keys.GetCmd())
22+
for _, cmd := range keys.GetCmds() {
23+
rootCmd.AddCommand(cmd)
24+
}
2325
rootCmd.AddCommand(encrypt.GetCmd())
2426
rootCmd.AddCommand(decrypt.GetCmd())
2527
}

tools_self_check.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ printf "[1/5] build...\n"
1515
make build
1616

1717
printf "[2/5] generate root key...\n"
18-
./tools key-gen --type root --force --dir "$KEY_DIR"
18+
./tools gen-root-key --force --dir "$KEY_DIR"
1919

2020
printf "[3/5] generate work key...\n"
21-
./tools key-gen --type work --name work.key --force --dir "$KEY_DIR"
21+
./tools gen-work-key --name work.key --force --dir "$KEY_DIR"
2222

2323
printf "[4/5] encrypt/decrypt...\n"
2424
plain="hello-world-$(date +%s)"

0 commit comments

Comments
 (0)