单篇加密:保护你的私有内容
Period 主题内置单篇加密功能:正文加密后只显示密文,读者输入密码由浏览器端解密展示。 适合私密内容、私人笔记等场景。
特性
- 真加密:构建产物与源码中均无明文,只有 AES-256-GCM 密文;
- 零依赖前端:解密用浏览器原生 Web Crypto,无第三方库;
- 算法:PBKDF2-SHA256(10 万次迭代)派生密钥 + AES-256-GCM 加密;
- 不影响 SEO:密文块自动加
data-pagefind-ignore,标题/描述照常索引; - 不影响评论:Giscus 在正文外,加密与评论互不干扰。
快速开始(推荐:文章内标记 + 一键加密)
1. 在文章里直接写明文,用标记包裹
写作时,在需要加密的位置用 protect 标记包裹明文(Markdown 编辑器友好,所见即所得):
1可见正文……
2
3{{% protect %}}
4这是要加密的明文内容,直接写在这里
5{{% /protect %}}
6
7可见正文……
2. 发布前原地加密
1cd themes/period
2node scripts/encrypt.mjs --lock content/post/xxx.md # 交互输入密码,原地替换为密文
3node scripts/encrypt.mjs --lock content/post/xxx.md 密码 # 或直接给密码
4node scripts/encrypt.mjs --lock content/post/ # 支持目录批量
执行后,文件里的明文标记被替换为密文 shortcode(提交到仓库的是密文,无明文)。
3. 修改已加密文章
1node scripts/encrypt.mjs --unlock content/post/xxx.md # 密文还原为明文标记,改完再 --lock
其他用法(命令行管道,简单场景)
1node scripts/encrypt.mjs "密码" < plain.txt > cipher.txt # 加密文本片段
2node scripts/encrypt.mjs --decrypt "密码" < cipher.txt # 解密验证
git pre-commit 钩子(可选,防明文泄漏)
将 themes/period/scripts/pre-commit.example 复制到 .git/hooks/pre-commit:
提交时若检测到 content/ 下仍有未加密的明文标记,会阻止提交,提醒先跑 --lock。
(本仓库的 .git/hooks/pre-commit 已启用。)
4. 读者行为
- 页面加载后,加密块显示 🔒 标题 + 密码输入框;
- 输入正确密码 → 正文原地展示;
- 密码错误 → 提示"密码错误"(GCM 完整性校验,不会出现乱码)。
演示(试试密码 hugo-period)
下面是一个真实的加密块——输入 hugo-period 解锁:
ePANrzvToedjChQ8SH+w7+y4FXuncJRr3olUT82Fxg0nVPZozpiHdUjNwaWAO2QMNPaZO8RiHPbc0Yg+AVHOiU2FSIChx8YgeaDnULWOA8VULjjeWvx7gVltBgR+EPyeW2cVpU8tnUpxeyiYo7Bsw77zNVTs0fpXwkbSLdmjBL7Ph9yEgjiDSp3FVg1cd4t/hm4A/hsu4Af+GsOvfROHN+6pClWiI7HWcsR46KNfWQnHv8Vyz8b/9ldXxhah7VcufWG/nJkDKlOkDglZoUW6b9n72zoQC2Pnrg1msFHyJ2IuEMuGqrLRLso5QkSJAZr7oUno7rQKEEnOCo+or1y6tj0SV3+C6Xvu5oqfIYeuYqczwK2RZx9Zs+j7n74I4z4i5y1goI60qZ0zMNlrrS9+V0SielzXKlHGp3V7Tvum4uaP7bvVDYraZ/hrbfVHujiryhgKXAHgXK6R55ulHEFI1VxT2ZrPOB4pAsdGeF7sP/MLim6V+QhO7PbYeLZJ4iHe5Jgsc77YYZxz163oso9MrwGCR2yrRRiyfAwpzbD/tVYkJ7KcYtlFCBUbaQSvHpPfFlgz38ubGIdWNzuisEXGw8PtLg==
安全边界
- 静态站加密无法防定向攻击(逆向 JS、离线爆破密文),密码务必 ≥10 位且不含于常用字典;
- 密文在页面内,理论上可被离线破解——请勿用于极高敏感内容;
- 密码通过浏览器 JS 解密,不经过任何服务器,无隐私泄露;
- 忘记密码 = 永久丢失(无找回机制)。
常见问题
| 问题 | 说明 |
|---|---|
| 输入框没显示 | 浏览器需 HTTPS 或 localhost(Web Crypto 要求安全上下文) |
| 提示"环境不支持" | 同上;本地 hugo server 的 localhost 不受影响 |
| 加密块进了搜索 | 已加 data-pagefind-ignore;若仍出现请重新构建索引 |
| 能改密码吗 | 重新加密生成新密文替换即可(密码不进页面,随时可换) |
发表评论