问题:错误往往发生在执行,而不是判断
很多交易者都写过自己的交易规则:单笔仓位不超过多少、不追高、不加仓摊平、亏损后不报复性开仓、情绪不对就停手。 规则本身通常并不难懂。难的是在行情剧烈波动、情绪最强烈的那几秒里想起它、遵守它。
事后回看亏损最大的几笔,原因常常不是「没看懂行情」,而是「明知故犯」:仓位放大了、理由是「先上车再说」、心态是「今天必须赚回来」。
1.1现有工具的空白
- 交易日志 / 表格:记录发生在交易之后,擅长统计错误,但拦不住错误。
- 行情与信号工具:回答「该买什么」,而真正的问题常常是「我此刻适不适合做决定」。
- 券商风控:管的是保证金和合规,不管你自己定下的个人规矩。
1.2设计目标
- 在决策点介入:检查发生在「存入」之前,而不是复盘时。
- 规则属于用户:阈值与词库由用户自己编辑,工具不替用户制定交易体系。
- 低摩擦:不注册、不绑定账户,打开即可记录;想长期保存时再设密码。
- 私密:交易记录暴露仓位、习惯和弱点,必须端到端加密,服务器不可读。
产品:记录 → 检查 → 加密 → 复盘
2.1核心流程
- 记录:写下标的、方向(做多/做空)、仓位百分比、当下情绪和一句理由。
- 检查:按规则实时检查。命中的规则逐条列出;用户仍可选择存入,但该笔会被标记为「触碰纪律」。
- 加密保存:设置了密码的保险库在本机加密后保存(本地或云端);免密试用的数据只存在当前浏览器会话中。
- 补结果:平仓后补填盈亏。
- 复盘:情绪 × 盈亏交叉统计、纪律报告卡,看清自己在哪种状态下最容易亏损。
2.2功能一览
| 功能 | 说明 |
|---|---|
| 纪律守卫 | 默认规则:单笔仓位上限 10%;冲动交易词库(追高、梭哈、满仓干、加仓摊平、扛单、报复性);情绪警示词库(上头、赌一把、翻本、心态崩、忍不住)。阈值与词库均可编辑。 |
| 情绪标记 | 六种情绪:平静、贪婪、恐惧、急躁、后悔、自信。贪婪或急躁时额外提醒;恐惧状态下做空时提醒区分判断与情绪。 |
| 情绪 × 盈亏 | 按情绪分组统计笔数与平均盈亏,对比平静与贪婪/急躁状态下的表现。 |
| 纪律报告卡 | 汇总近期纪律执行情况,脱敏后可分享给交易伙伴互相监督。 |
| 免密试用 | 不设密码即可记录,数据存于 sessionStorage(明文,关闭页面即消失);首次设置密码时自动加密并入。 |
| 云端同步(可选) | 配置房间号后多设备共享同一份密文记录;按条写入,并发修改以版本号检测冲突。 |
| 备份导出 | 导出为明文 JSON 文件,便于自行留档。导出文件不加密,请妥善保管。 |
2.3两种形态
- 云端版:部署在
vault.claw402.net,默认本地加密保存,可选开启云端同步。 - 本地版:单个
mind-vault.html文件,双击即可在浏览器中打开,默认完全不联网;与云端版使用同一套加密实现。
架构:所有逻辑在浏览器里,服务器只是密文仓库
MIND Agent 没有传统意义上的「后端业务逻辑」。规则检查、统计、加密和解密全部在用户浏览器中完成;云端只负责按条保管密文,并校验写权限与版本。
- 界面与规则引擎
- 密钥派生 / 加解密
- 写入令牌生成
仅密文 + 令牌
- CORS 白名单
- 格式 / 大小校验
- 令牌哈希比对 · 版本号
读写
- 每条记录一个键
- 密文 + 令牌哈希
- 无密码、无密钥
3.1数据模型
每条记录在 KV 中是独立的键 mind:v2:<房间号>:<记录 ID>,值为:
3.2接口
| 方法 | 作用 | 约束 |
|---|---|---|
| GET | 读取房间内全部记录(密文) | 最多返回 5000 条;可附带最近写入的 ID 以绕过 KV 列表延迟 |
| POST | 按条新建或更新(每次 1–50 条) | 更新须提供匹配的写入令牌(否则 403)与当前版本号(否则 409) |
| DELETE | 删除指定 ID 的一条记录 | 须提供匹配的写入令牌 |
| 旧版整表写入 | v6 及更早的「整表覆盖」 | 一律拒绝(410)。不存在任何能一次清空房间的接口 |
其他限制:房间号 4–32 位字母数字(含 _ -);单条密文 ≤ 64KB;单次请求 ≤ 512KB;只接受 v2 加密信封;跨域请求仅放行官方页面来源(以及本地开发地址)。
3.3并发与一致性
每条记录独立存储,所以不同记录之间永远不会互相覆盖。对同一条记录的并发修改通过版本号检测:客户端提交的版本与服务器不一致时返回 409,客户端刷新后再提示用户。 需要说明的是,Workers KV 是最终一致的存储,不提供原子的比较并交换;在不同地区几乎同时修改同一条记录时,仍可能出现后写者胜。
加密设计
原则:只使用浏览器原生的 Web Crypto API,不引入第三方加密库;密钥对象设为不可导出,只存在于页面内存中,从不写入 localStorage 或任何存储;锁定即丢弃。
4.1密钥派生与分离
同一个密码派生出两把互不相关的钥匙:一把只用于加密,一把只用于生成写入令牌。服务器即便拿到令牌,也无法反推出加密钥匙。盐不是秘密,随密文一起保存;每个保险库在创建时随机生成。
4.2记录加密与信封格式
- 每条记录独立随机 IV,同样的内容两次加密结果完全不同。
- GCM 认证标签保证完整性:密文被改动一个比特,解密就会失败,而不是解出错误内容。
- 附加认证数据(AAD)把密文绑定到它所在的位置:把 A 记录的密文挪到 B 记录的位置,同样会解密失败。
- 版本前缀
v2:让未来升级算法时可以平滑迁移。
4.3密码校验
本地保险库保存一段加密的固定标记 MIND_OK;云端每条记录的明文中也带有该标记。解锁时如果认证失败或标记不符,即判定为密码错误,不会把错误密码写进任何数据。
4.4写入令牌:只有作者能改、能删
令牌按记录、按房间派生,不同记录的令牌互不相同。同一房间里的其他人(或任何只知道房间号的人)没有你的密码,就算不出你的令牌,因此读不懂、改不了、删不掉你的记录。服务器只存令牌的哈希,即使存储泄露,也无法用它冒充你写入。
4.5参数
| 项目 | 取值 | 说明 |
|---|---|---|
| 密钥派生 | PBKDF2-HMAC-SHA256,600,000 次 | OWASP 2023 对 PBKDF2-SHA256 的建议值;每次猜测密码都要付出同样代价 |
| 盐 | 16 字节随机 | 每个保险库独立,使预计算与批量破解失效 |
| 密钥分离 | HKDF-SHA256 | 加密钥匙与令牌钥匙相互独立 |
| 加密 | AES-256-GCM | 12 字节随机 IV,16 字节认证标签,带 AAD |
| 写权限 | HMAC-SHA256 令牌 | 服务器只存 SHA-256 哈希 |
| 耗时 | 桌面约 0.1–0.3 秒,手机约 0.5–1 秒 | 每次解锁每个盐只计算一次,之后缓存在内存 |
4.6旧格式兼容
v6 及更早版本的云端数据使用 CryptoJS 口令模式(EVP_BytesToKey,MD5 单次迭代),本地数据使用固定盐的 PBKDF2-SHA1(1 万次)。这两种方案对离线暴力破解都偏弱,且与旧文档「PBKDF2 派生」的描述不完全相符。 v6.1 以原生实现只读兼容这两种旧格式:本地保险库在解锁时立即以 v2 重新加密;云端属于你的旧记录在解锁后于后台重新加密并认领所有权。解不开的记录原样保留,不会被覆盖。
4.7页面完整性
- 零第三方脚本:不加载任何 CDN 脚本、外部字体或统计代码。
- 严格 CSP:应用页只允许执行哈希匹配的唯一内联脚本,网络请求只允许发往同步 API;本白皮书页面不允许执行任何脚本。
- 其他响应头:禁止被嵌入框架、禁止 MIME 嗅探、不发送 Referer、HSTS、跨源隔离。
- 不使用内联事件:所有交互通过白名单动作表分发;渲染用户内容前统一转义。
威胁模型与局限
安全描述只有在说清楚「防不住什么」时才可信。以下是我们对自身边界的完整说明。
5.1防护范围
| 对手 | 能做什么 | 防护 |
|---|---|---|
| 拿到存储数据的人 | 读取全部密文(如云服务账号泄露) | 随机盐 + 60 万次 PBKDF2 + AES-256-GCM:只能逐个猜密码,且每次猜测代价高昂 |
| 只知道房间号的人 | 调用同步接口 | 没有整表覆盖接口;修改、删除需要按记录派生的令牌;只接受 v2 加密信封 |
| 同房间的其他用户 | 看到你的密文 | 解不开,改不了,删不掉 |
| 网络中间人 | 窃听或篡改传输 | 全程 HTTPS + HSTS;内容本身已加密,篡改会导致认证失败 |
| 第三方脚本供应链 | 通过 CDN 投毒 | 页面不加载任何第三方脚本;CSP 只放行哈希匹配的脚本 |
| 页面注入(XSS) | 执行脚本、外传数据 | CSP 禁止内联脚本与外部连接;用户内容统一转义;入站数据先做类型规范化 |
5.2不在防护范围内
- 已解锁且被他人控制的设备:解锁期间密钥在内存里,能操作你电脑的人就能看到内容。用完请锁定。
- 恶意浏览器扩展、键盘记录器、恶意软件:它们可以在你输入密码时直接读取。
- 弱密码:60 万次迭代只能放慢猜测速度,不能拯救「123456」。请使用足够长的独特密码。
- 页面托管方被攻破:与所有网页应用一样,如果托管页面的账号被攻破并投放恶意代码,攻击者可以在你下次解锁时窃取密码。对此最敏感的用户可以使用离线的本地版。
5.3已知局限
- KV 最终一致:同一条记录在不同地区几乎同时被修改时,可能后写者胜。
- 旧记录认领窗口:从旧版迁移出的记录在原作者用新版解锁前没有所有者,理论上可被知道房间号的人抢先认领。所有用户升级后,运营方可关闭认领。
- 房间可被灌入垃圾:知道房间号的人仍可新建记录(受大小与格式限制)。房间号请像密码一样保管。
- 元数据可见:服务器能看到记录数量、ID(含创建时间)、版本号、密文长度和常规网络元数据。
- 样式策略:应用页因大量动态样式使用
style-src 'unsafe-inline';脚本策略仍然是严格的。 - 明文区域:免密试用数据(sessionStorage)与导出的备份文件是明文,界面上均有提示。
- 密码常驻内存:会话期间密码保留在页面内存中,用于在云端发现新的盐时派生钥匙;锁定或关闭页面即清除。
发展路线
每个版本只解决一个具体问题。以下「规划中」的内容是方向而非承诺,可能根据实际使用反馈调整。
- v2加密地基AES 加密存储、Cloudflare Worker + KV 同步通道、密码派生密钥。已交付
- v3纪律守卫可编辑的纪律规则、写入前实时检查、六种情绪标记、主动提醒、统计页。已交付
- v4视觉与交互体系设计令牌、动效系统、品牌首屏、指标卡、时间轴。已交付
- v5降低使用门槛免密快速记录、情绪 × 盈亏、纪律报告卡;修正标的字段明文落盘等缺陷。已交付
- v6视觉重建 + 安全加固v6 以海拔体系重建界面。v6.1:WebCrypto(PBKDF2-SHA256 60 万次 + AES-256-GCM)、按条写入 + 作者令牌 + 版本冲突检测、严格 CSP、零第三方脚本。当前
- v7规则可定制在现有阈值与词库编辑之上,开放更多规则类型与组合(如单日笔数、连亏后冷静期),并允许自定义哪些情绪属于高风险。规划中
- v8只读导入导入交易所导出的成交账单文件,在本机解析后加密保存,与当时写下的理由对照复盘。只读文件导入,解析全程在本机完成。规划中
常见问题
忘记密码怎么办?
无法找回。密码从不离开你的设备,运营方没有任何办法解密你的数据。建议用密码管理器保存密码,并定期导出备份。
服务器或运营方能看到我的交易记录吗?
不能。标的、方向、仓位、情绪、理由、盈亏和你的规则都在浏览器里加密后才上传。服务器能看到的只有密文、记录数量、记录 ID(含创建时间)、版本号和常规网络元数据。
为什么解锁时要等一下?
这是 60 万次 PBKDF2 迭代的代价,桌面端约 0.1–0.3 秒,手机约 0.5–1 秒。同样的代价会让试图暴力破解你密码的人每猜一次都慢下来。
和别人共用一个房间号安全吗?
每个人用自己的密码加密,彼此看不到对方的内容,也无法修改或删除对方的记录。但知道房间号的人可以向房间写入新记录,因此建议每人使用自己的、不易猜到的房间号。
免密试用的数据存在哪里?
只存在当前浏览器标签页的 sessionStorage 中,未加密,关闭页面即消失。首次设置密码时,试用期间的记录会被加密并入保险库。
怎么在手机和电脑之间同步?
在两台设备上配置同一个同步地址与房间号,并使用同一个密码解锁即可。数据以密文形式按条同步,两边同时修改同一条记录时会提示版本冲突。
本地版和云端版有什么区别?
两者使用完全相同的加密实现。本地版是一个可离线打开的 HTML 文件,默认不联网,适合对托管环境最谨慎的用户;云端版免安装,并可选开启多设备同步。
导出的备份安全吗?
备份文件是明文 JSON,便于你自行留档和迁移。请像保管纸质交易记录一样保管它,不要上传到公开位置。
以前版本的数据还能打开吗?
可以。v6.1 能读取旧版云端和本地两种加密格式,并在你解锁后自动升级为 v2 格式,无需手动操作。
它的提示算投资建议吗?
不算。所有提示都只是把你自己设定的规则应用到你自己写下的计划上,不涉及任何行情判断或标的推荐。
参考
- RFC 8018 — PKCS #5: Password-Based Cryptography Specification v2.1(PBKDF2)
- RFC 5869 — HMAC-based Extract-and-Expand Key Derivation Function(HKDF)
- RFC 2104 — HMAC: Keyed-Hashing for Message Authentication
- NIST SP 800-38D — Galois/Counter Mode (GCM) and GMAC
- W3C — Web Cryptography API
- W3C — Content Security Policy Level 3
- OWASP — Password Storage Cheat Sheet(PBKDF2-HMAC-SHA256 迭代次数建议)
下一笔之前,先过一遍自己的规矩
不用注册,打开即用;想长期保存时再设置密码。