Skip to content

修改加密口令时,旧口令校验只认本地 syncEncryptKey #897

Description

@whikqp

先说 #802:我同意那里对改口令流程的解释。改口令前先用旧口令同步,成功后再用新口令重写,这个流程是合理的。这里想单独说一下旁边那个「旧口令」输入框。

我的情况是自建 kiss-worker(Cloudflare Workers),某次不小心往加密口令里粘错了一串东西,之后就改不回来了。

弹窗里的旧口令比对的是本地存的 syncEncryptKey:

https://github.com/fishjar/kiss-translator/blob/master/src/views/Options/SyncSetting.js#L188

if (encryptKeyDialogMode === "change" && oldEncryptKey !== syncEncryptKey) {

它比对的不是云端,也不是那个真正能解开云端数据的口令,而是本地那份字符串。我本地已经存成粘错的内容了,所以填真正的口令会被提示「旧口令不正确」。插件认定的当前口令,反而是那串错值。

这里有个比较尴尬的点:这个校验拦不住能打开弹窗的人。口令框虽然是 readOnly,但旁边就有眼睛图标可以明文显示(SyncSetting.js#L322-L340)。点一下眼睛,再把显示出来的内容填进「旧口令」框,就能通过这一层。它查的其实不是「你知道旧口令」,而是「你能把屏幕上已经露出的字符串再输入一遍」。

真正卡住的是后面。填真口令,过不了上面的本地值校验;照着眼睛图标填错值,changeSyncEncryptKey 第一步的 syncSettingAndRules()(sync.js#L488-L489)会拿这个错值去同步云端,还是失败。

另一条路也走不到。openEncryptKeyDialog(syncEncryptKey ? "change" : "set")(SyncSetting.js#L351),只有 syncEncryptKey 为空时才会进 set 模式。set 模式本来正适合这种恢复场景:跳过重加密,只写本地。但珰在 UI 里没有入口能把 syncEncryptKey 清空。

我最后是手动改 chrome.storage.local 里的 KISS-Translator_sync 才恢复的。

可以考虑把旧口令校验改成用它试解一次云端密文。这样验证的是实际能不能解开云端数据,也能把「本地口令和云端数据对不上」这个问题暴露出来,不会停在一句「旧口令不正确」。

另外,如果能提供一个清除口令的入口,让 syncEncryptKey 回到空值状态,也可以直接走现有的 set 路径恢复。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions