回到文章列表

网页安全

网页里写着 AES-256,也不等于它是保险箱

Arcuid 的树洞用了真加密,但代码、密文和线索都在浏览器里。它能当机关,不能拿来藏真正的秘密。

Arcuid 的树洞不是拿 Base64 糊弄人的。暗号会经过 PBKDF2,正文用 AES-256-GCM 加密,临时密钥存在 sessionStorage

算法都是真的。保险箱是假的。

算法没错,问题在系统边界

AES-GCM 和 PBKDF2 本身没毛病。问题是浏览器想把正文解出来,就必须拿到需要的材料:

  • 密文随 JavaScript 一起公开下载;
  • 固定盐写在前端代码中;
  • 暗号也存在于公开脚本;
  • 解密逻辑完全在客户端执行。

愿意打开开发者工具的人,可以读脚本,也可以自己复现整个过程。sessionStorage 只是不让明文暗号直接躺在存储里,并没有突然把公开网页变成服务端权限系统。

那我为什么还留着它

因为它当网页机关挺好玩,而且确实能做几件小事:

  1. 叙事机关。 让“找到入口”和“解锁内容”成为体验的一部分。
  2. 避免搜索引擎直接索引。 明文不在初始 HTML 中,普通爬虫不会直接看到。
  3. 防止随手窥视。 不知道入口的人不会无意间读到内容。

到这里就该停了。真实身份、私人日记、密钥和凭证不能往里放。任何“泄露会出事”的内容都不行。

真要保密,门得装在服务端

如果目标真是“只有被允许的人能看”,就不能把钥匙、锁和说明书一起送到每个浏览器,再希望别人自觉不拆。

通常需要:

  • 服务端身份验证;
  • 服务端授权判断;
  • 按用户或会话下发密文/密钥;
  • 合理的密钥轮换和撤销;
  • 防止缓存和日志意外泄漏。

静态站可以接身份服务和边缘函数,只是复杂度会立刻涨上去。这个树洞不值得这么折腾,所以我选择把边界写明白。

现在这版怎么处理

树洞还在,但不再装成黑客电影里的绝密入口:

  • 入口明确称为“客户端叙事实验”;
  • 解锁页面说明它不是安全保险箱;
  • 内容继续使用加密格式,保留仪式感;
  • 深渊页面不再获取真实 IP;
  • 所有“设备信息”只在本地生成,并明确标注为模拟演出。

最后一层照样会演终端扫描,只是台边直接写着“虚构演出”。知道是假的,并不妨碍它有气氛。

下次看到“前端加密”

一个完全控制自己浏览器的陌生人,是否能够获得解密所需的代码和数据?

如果答案是“能”,那它最多是内容混淆或交互谜题,不是访问控制。

算法名字再长,也跨不过系统边界。树洞就留在树洞该待的位置,别拿它放钥匙。

看到这里了

要不要说两句

评论还没加载,往下滚到这里才会去请求。