Arcuid 的树洞不是拿 Base64 糊弄人的。暗号会经过 PBKDF2,正文用 AES-256-GCM 加密,临时密钥存在 sessionStorage。
算法都是真的。保险箱是假的。
算法没错,问题在系统边界
AES-GCM 和 PBKDF2 本身没毛病。问题是浏览器想把正文解出来,就必须拿到需要的材料:
- 密文随 JavaScript 一起公开下载;
- 固定盐写在前端代码中;
- 暗号也存在于公开脚本;
- 解密逻辑完全在客户端执行。
愿意打开开发者工具的人,可以读脚本,也可以自己复现整个过程。sessionStorage 只是不让明文暗号直接躺在存储里,并没有突然把公开网页变成服务端权限系统。
那我为什么还留着它
因为它当网页机关挺好玩,而且确实能做几件小事:
- 叙事机关。 让“找到入口”和“解锁内容”成为体验的一部分。
- 避免搜索引擎直接索引。 明文不在初始 HTML 中,普通爬虫不会直接看到。
- 防止随手窥视。 不知道入口的人不会无意间读到内容。
到这里就该停了。真实身份、私人日记、密钥和凭证不能往里放。任何“泄露会出事”的内容都不行。
真要保密,门得装在服务端
如果目标真是“只有被允许的人能看”,就不能把钥匙、锁和说明书一起送到每个浏览器,再希望别人自觉不拆。
通常需要:
- 服务端身份验证;
- 服务端授权判断;
- 按用户或会话下发密文/密钥;
- 合理的密钥轮换和撤销;
- 防止缓存和日志意外泄漏。
静态站可以接身份服务和边缘函数,只是复杂度会立刻涨上去。这个树洞不值得这么折腾,所以我选择把边界写明白。
现在这版怎么处理
树洞还在,但不再装成黑客电影里的绝密入口:
- 入口明确称为“客户端叙事实验”;
- 解锁页面说明它不是安全保险箱;
- 内容继续使用加密格式,保留仪式感;
- 深渊页面不再获取真实 IP;
- 所有“设备信息”只在本地生成,并明确标注为模拟演出。
最后一层照样会演终端扫描,只是台边直接写着“虚构演出”。知道是假的,并不妨碍它有气氛。
下次看到“前端加密”
一个完全控制自己浏览器的陌生人,是否能够获得解密所需的代码和数据?
如果答案是“能”,那它最多是内容混淆或交互谜题,不是访问控制。
算法名字再长,也跨不过系统边界。树洞就留在树洞该待的位置,别拿它放钥匙。
看到这里了
要不要说两句
评论还没加载,往下滚到这里才会去请求。