你有没有遇到过这种场景?
- 做了一个付费课程的预览页,只想让付过钱的人看到内容
- 开发了一个小游戏 / 小工具,只想在小圈子里分享,不想被搜索引擎收录、被陌生人随便打开
- 临时需要把一个页面分享给特定的人,但不想搭服务器、不想写后端、不想折腾鉴权系统
传统方案是什么?Nginx 加个 Basic Auth?搭个 Node/Python 后端做登录?用第三方 SaaS 加密平台?
太重了。
我只是想给一个 HTML 页面加把锁而已。
所以我写了 StaticShield——一个零后端、零依赖的静态网页加密工具。一条命令,把你的 HTML 变成一份「自解密页面」:没有密码,看到的是一扇锁着的门;输入密码,浏览器本地解密,原始内容瞬间还原。
它到底做了什么?
1 | 原始站点(HTML + CSS + JS + 图片) |
加密后的产物仍然是一个普通的 HTML 文件。 扔到 GitHub Pages、Cloudflare Pages、阿里云 OSS、Nginx 静态目录、甚至 U 盘里都行。不需要服务器跑任何后端逻辑,解密完全发生在访客的浏览器里(基于 WebCrypto API)。
🐎 实战示例:给「奉国牧马」加一把锁
「奉国牧马」(Horse Empire)是我做的一款古风牧场育成放置游戏。谁小时候没幻想过拥有一群自己的马呢?在这里,你可以体验从几匹普通慢驹起步,割草喂马、配对繁殖,慢慢育出良驹、千里驹、贡驹,直到培养出「神驹」的极致快感!
它不只是简单的养马,更是一个充满深度的经营世界,绝对让你玩得停不下来:
- 🎲 配种如开盲盒:马分五等(慢驹→良驹→千里驹→贡驹→神驹),同级配对有概率升级、同级或退化。加上双胎丹、产房等道具、建筑,每一匹幼驹的降生都充满期待感。
- 🌾 真实的生态与经营:6级草场可升级,但要注意生态健康度!过度繁殖会导致「荒漠化」,产量暴跌,你必须靠植树、休耕来恢复地力。
- ⚡ 丰富的随机事件:流星雨、马瘟、狼袭、天降甘露……10种随机事件搭配狼围栏、疫苗站等 7 座功能建筑,让牧场生活充满意外与策略挑战。
- 🏆 三大结局等你解锁:血统、财富、建筑三条路线,全成就大结局等你来挑战!
🔗 原站:https://horseempire.pages.dev/
🔗 加密站:https://horseempire-staticshield.pages.dev/
🔑 密码:horseempire-staticshield
你可以现在就打开加密站体验: 一个干净的门禁页面,输入密码,点击解锁,整个游戏瞬间还原,和原站体验完全一致。
项目结构
「奉国牧马」是一个典型的多文件前端项目:
1 | horseempire/ |
1 个 HTML + 1 个 CSS + 16 个 JS,共 18 个文件。
一条命令搞定!
使用StaticShield 的 --bundle 模式,先自动把所有 CSS、JS、图片全部内联进 HTML,变成单文件,然后整体加密。
1 | node encrypt.js index.html \ |
| 参数 | 作用 |
|---|---|
--bundle |
将 CSS 和 16 个 JS文件 全部内联,输出单文件 |
-p horseempire-staticshield |
设置解密密码 |
--hint "原站:..." |
门禁页显示密码提示 |
--remember 7 |
访客可勾选「记住我」,7 天免重复输入 |
-d ./dist |
输出目录 |
执行完,./dist/index.html 就是加密产物——一个文件,包含整个游戏,已被 AES-256 加密。不到 1 秒,18 个文件变成了1 个加密文件。
核心特性
| 特性 | 说明 |
|---|---|
| 🔐 AES-256-CBC | 对称加密,PKCS#7 填充 |
| 🔑 PBKDF2 百万次迭代 | 默认 SHA-256,可选 SHA-512 |
| ✅ HMAC-SHA256 验签 | Encrypt-then-MAC,防篡改 |
| 📦 整站打包 | 支持 --bundle 内联所有资源 |
| 🖥️ CLI + Web GUI | 提供命令行和图形界面两种使用方式 |
| 🎲 随机强密码 | CSPRNG 生成 |
| 🔗 分享链接 | 密码写入 URL Hash,不经过服务器 |
| 💾 记住我 | 本机免重复输入,可设过期 |
| 🔒 重叠加密 | 多层密码逐层剥解 |
| 🚫 零依赖 | 不需要 npm install |
更多用法
1 | # 交互式输入密码(不回显) |
安全吗
我知道一提到「前端加密」,很多人第一反应是:
“前端加密不就是自欺欺人吗?源码里什么都有。”
这个质疑有道理,但只对了一半。
先说算法强度。 StaticShield 使用的加密组合——AES-256-CBC + PBKDF2(100 万次迭代)+ HMAC-SHA256——与美国国家安全局(NSA)批准用于保护「绝密」(TOP SECRET)级别信息的标准处于同一级别。银行间清算(SWIFT)、各国电子护照、TLS 1.3、磁盘全盘加密(BitLocker / FileVault),底层都是 AES-256。
AES-256 的密钥空间是 2²⁵⁶ ≈ 1.16 × 10⁷⁷。假设全人类 80 亿人每人每秒尝试 10 亿个密钥,穷举需要约 4.6 × 10⁵⁰ 年。暴力破解 AES-256 在物理上不可能。
再说密钥派生。 用户密码不能直接当密钥,StaticShield 用 PBKDF2 做拉伸,默认迭代 1,000,000 次,而OWASP 2023 年建议 PBKDF2-SHA256 也才至少 600,000 次——直接超了 67%。实际效果:攻击者拿到密文想穷举一个 8 位混合密码(62 字符集),即使用高端 GPU,期望耗时也在数月以上。每多一位密码,难度就会指数级增长。
再说完整性。 StaticShield 采用 Encrypt-then-MAC:先加密,再对密文算 HMAC-SHA256;解密时先验签,通过才解密。密文被改动哪怕一个比特,验签直接失败,解密根本不执行。这彻底堵死了 Padding Oracle Attack 这条路——2014 年的 POODLE攻击,本质上就是利用了缺少完整性校验的缺陷。
再说实现层面。 浏览器端解密不是 JS 手写的算法,而是调用 WebCrypto API(crypto.subtle),底层由操作系统加密库(Windows CNG / macOS CommonCrypto / Linux OpenSSL)执行,密钥操作在浏览器沙箱内部完成,JS 层无法读取密钥原始字节。每次加密随机生成 IV 和 Salt,相同内容每次加密的密文都不同。分享链接的密码写在 URL Hash 里,浏览器不会把 Hash 发送到服务器——服务端日志、CDN 日志、Referer 头中都看不到密码。
所以够不够「企业级」? 加密算法强度——完全够,就是金融/军事用的那套。作为「门禁式访问控制」——在纯前端方案中,这已经是天花板了。
为什么不用现成方案?
| 方案 | 问题/特性 |
|---|---|
| Nginx Basic Auth | 需要服务器,密码明文传输,体验差 |
| 自建后端登录 | 杀鸡用牛刀 |
| 第三方 SaaS 加密 | 内容经过第三方,隐私存疑 |
| Cloudflare Access | 需要企业版,配置复杂 |
| StaticShield | 零后端、零依赖、本地加密、浏览器解密 |
最后
「奉国牧马」是第一个吃螃蟹的项目——18 个文件,一条 --bundle 命令,1 秒变成 1 个加密文件,输入密码就能玩。
如果你也有「给 HTML 加个密码保护」的需求:
https://github.com/wangshengithub/staticshield
欢迎先体验加密后的「奉国牧马」:https://horseempire-staticshield.pages.dev/(密码:horseempire-staticshield)
觉得有用请给项目点个 ⭐ Star,也欢迎提 Issue 和 PR,这是对我最大的支持。