type A {
Config string
}
A 是从文件中反序列化得到的。 之前 A.Config 是明文保存的,现在要求是改成密文。但是代码里面有大量使用 A.Config 的地方,我现在要每个使用 A.Config 地方都要修改,有点麻烦。有没有好的解决方案?
1
Nazz 2023-07-18 11:28:08 +08:00
封装个 GetConfig 方法, 替代直接访问
|
2
javalaw2010 2023-07-18 11:29:17 +08:00
A 加个字段叫 SecretConfig,发序列化到这个字段上,然后顺手解密到 Config 字段上,其他不动
|
3
aapeli 2023-07-18 11:30:46 +08:00 3
密文保存。明文使用??
自定义 序列化和反序列化函数,在序列化函数中加密,在反序列化函数中解密 例如,假设文件中的内容是 json type Config string func (c *Config) UnmarshalJSON(data []byte) error { var value string if err := json.Unmarshal(data, &value); err != nil { return err } // value 目前是密文 c.Value = jie_mi(value) return nil } func (c Config) MarshalJSON() ([]byte, error) { var value string = c return json.Marshal(jia_mi(value)) } |
4
lsk569937453 2023-07-18 11:32:23 +08:00
用 github copilot ,简直是重构神器。。。
|
5
aapeli 2023-07-18 11:33:01 +08:00
这样的话 Config 底层类型是 string 可以直接当 string 用,不用改任何调用方的代码,内存里的 Config 存储的是明文. 只有在保存和加载的时候才是密文
|
6
TuringGunner 2023-07-18 11:42:18 +08:00
Config 换成密文的,新增一个明文的字段用来读取文件初始化
|
7
shellcodecow 2023-07-18 11:45:06 +08:00
@lsk569937453 #4 除了提示以外,有什么高级用法吗?
|
8
YuuuuuuH 2023-07-18 15:15:15 +08:00
1. 先封装一个 `GetConfig() string`
```go func (a *A) GetConfig() string { return a.Config } ``` 2.使用 `gofmt` 批量替换引用 Config 的代码, `gofmt -d -r 'a.Config -> a.GetConfig()' <your-path>` (-d 表示只展示 diff ,不直接写入文件), 替换之后运行单元测试,保证不出错。 3.改写`GetConfig` 方法,在方法中将密文解密成明文返回。 |
9
hopingtop 2023-07-19 09:35:51 +08:00
按照我的理解,OP 是不是想这样?
type A struct { conf string `json:"Config"`// 存入你存入的配置 Config string `json:"-"` // 这个先为空, 假设已 JSON 序列化做示例 } 然后你看看 A 这个结构体怎么生成的,是不是一次生成,到处用。 如果是:那你就再 生成方法那里, 类似于 执行一个 Init() 方法,把 conf -> Config 这样你在使用的地方用 A.Config 就不需要改动。 如果这个结构体生成的地方很少,那么可能几行代码就解决了。 |
10
hopingtop 2023-07-19 09:39:48 +08:00
@hopingtop #9 我从 OP 的描述中。理解到的就是
1. 之前 文件中是保存的 明文,现在想 文件中保存 密文 2. 想改最少的代码,实现这个功能。 得出上述建议,如果我理解错了,就当我没说 ~ ~# |
11
mingdongshensen 2023-07-19 12:18:30 +08:00
也许可以用访问者的设计模式,定义访问者 visitor 去持有 config ,使用的地方调用 config 对象的方法,其内部在调用 config 所持有的特定的被预先注入的 visitor 对象的方法,相当于内部重定向了,最后在 visitor 被调的方法内去做解密工作
|
12
shaoyie 2023-07-26 22:26:11 +08:00
find . -name "*.go" | xargs sed -i -e 's/A\.Config/A.SecretConfig/g'
|
13
shaoyie 2023-07-26 22:26:34 +08:00
直接文件替换
|