按 Enter 键跳转到正文

单篇加密:保护你的私有内容

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 解锁:

安全边界

  • 静态站加密无法防定向攻击(逆向 JS、离线爆破密文),密码务必 ≥10 位且不含于常用字典;
  • 密文在页面内,理论上可被离线破解——请勿用于极高敏感内容;
  • 密码通过浏览器 JS 解密,不经过任何服务器,无隐私泄露;
  • 忘记密码 = 永久丢失(无找回机制)。

常见问题

问题说明
输入框没显示浏览器需 HTTPS 或 localhost(Web Crypto 要求安全上下文)
提示"环境不支持"同上;本地 hugo server 的 localhost 不受影响
加密块进了搜索已加 data-pagefind-ignore;若仍出现请重新构建索引
能改密码吗重新加密生成新密文替换即可(密码不进页面,随时可换)

发表评论