草稿 AES 加密
灵感:能力工具箱 aes-encrypt(crypto-js 本地加密客户草稿再存储)。
> 小四原创:口令 + AES.encrypt / decrypt 存 localStorage。
> 仅防「随手打开 DevTools 一眼明文」级风险;不是服务端安全边界。
何时使用
- 草稿含手机号/备注,不想明文躺在 localStorage
- Demo 演示「加密后再存」
- 导出文件前可选加密
硬约束
- 依赖:
crypto-js。 - 禁止把密钥/口令写进源码或仓库;由用户输入或安全会话持有。
- 口令为空拒绝加密;解密失败返回明确错误,勿返回半截明文。
- 实现要点注释标 小四原创。
- 文案说明:前端加密无法对抗本机木马/同域 XSS。
- 与 lowdb/SuperJSON 联用时:先序列化再加密字符串。
推荐实现
import CryptoJS from 'crypto-js'
export type CryptResult =
| { ok: true; cipher: string }
| { ok: false; error: string }
export type PlainResult =
| { ok: true; plain: string }
| { ok: false; error: string }
// 小四原创:草稿加密
export function encryptDraft(plain: string, passphrase: string): CryptResult {
const key = String(passphrase || '')
if (!key) return { ok: false, error: '请输入加密口令' }
if (!plain) return { ok: false, error: '草稿内容为空' }
try {
const cipher = CryptoJS.AES.encrypt(plain, key).toString()
return { ok: true, cipher }
} catch (e) {
return { ok: false, error: e instanceof Error ? e.message : String(e) }
}
}
export function decryptDraft(cipher: string, passphrase: string): PlainResult {
const key = String(passphrase || '')
if (!key) return { ok: false, error: '请输入解密口令' }
try {
const bytes = CryptoJS.AES.decrypt(String(cipher || ''), key)
const plain = bytes.toString(CryptoJS.enc.Utf8)
if (!plain) return { ok: false, error: '口令错误或密文损坏' }
return { ok: true, plain }
} catch (e) {
return { ok: false, error: e instanceof Error ? e.message : String(e) }
}
}
export function saveEncryptedDraft(storageKey: string, plain: string, passphrase: string) {
const r = encryptDraft(plain, passphrase)
if (!r.ok) return r
localStorage.setItem(storageKey, r.cipher)
return r
}
Agent 步骤
npm i crypto-js(及类型@types/crypto-js如需)。- 保存草稿:口令框 →
saveEncryptedDraft。 - 打开草稿:同口令
decryptDraft。 - 自测:错口令失败;对口令往返一致。
不要做
- 默认口令
123456写死进代码。 - 宣称「军用级/绝对安全」误导用户。
附加
- README.md · reference.md · templates/usage.md