1713 字
5 分钟
文章加密与密码保护演示
受密码保护的文章
恭喜!你已成功解锁这篇加密文章。浏览器使用 Web Crypto API(AES-256-GCM + PBKDF2) 在本地解密了这份预先编译好的内容。
1. 安全架构与核心特性
Shirone 的文章加密系统与受保护的相册共用同一套安全基础,为静态发布提供了企业级的安全能力:
-
静态 HTML 构建产物中零明文
在 Astro SSG 构建流程中,文章 Markdown 会被编译为 HTML,并在输出页面前立即以 AES-256-GCM 加密。发布出去的静态 HTML 中,受保护正文与大纲不含任何明文。 -
带 AAD 作用域绑定的认证加密
- 密钥派生遵循 OWASP 建议,使用 310,000 次 PBKDF2 迭代(SHA-256)与一个密码学安全的 16 字节随机盐;
- 每一份加密载荷都会生成独立的 12 字节随机 IV;
- 附加认证数据(AAD) 绑定
shirone-protected-content:1:post:${slug},确保密文无法在不同文章或相册之间被重放。
-
会话保持与磁盘零密码存储
- 解密后的内容缓存在浏览器临时会话存储中,30 分钟后过期;
- 明文密码绝不会写入磁盘或存储;
- 在同一会话内,解密状态可无缝跨越 Swup 客户端导航与页面刷新。
-
全站防泄漏
- 搜索索引:静态页面不含明文,搜索引擎与 Pagefind 都无法索引私密内容;
- RSS 订阅:受保护文章在订阅源中输出本地化占位内容,避免 RSS 聚合器抓取敏感文本;
- 卡片摘要与字数:配置
hideHomeContent: true后,列表页与归档卡片的描述和字数会被遮蔽; - 目录(TOC):解锁前标题层级保持隐藏,解密后再动态重建并与 M3E 样式同步。
💡 演示说明:本篇演示文章的默认解锁密码是
shirone-secret。
2. 交互式富内容演示
文章解密后会与运行时辅助模块协同,动态挂载语法高亮、代码折叠、可交互的 Mermaid 图表、LaTeX 公式与图片灯箱。
2.1 代码块与语法高亮
下面的代码块用于检验 Expressive Code 的语法高亮、复制操作与行装饰:
import { decryptProtectedContent, type ProtectedPayload } from "@/utils/password-protection";
/** * 客户端文章解密示例 */async function unlockArticle(payload: ProtectedPayload, password: string): Promise<string> { const scope = payload.scope; console.log(`[Shirone] Decrypting scope: ${scope}`);
// 执行带 AAD 校验的 AES-256-GCM 解密 const decryptedHtml = await decryptProtectedContent(payload, password, scope); console.log("[Shirone] Decryption successful, length:", decryptedHtml.length); return decryptedHtml;}# 校验构建与类型检查npx.cmd astro checkpnpm.cmd type-checkpnpm.cmd test2.2 Mermaid 架构图
下面的流程图由 Mermaid 渲染,并在解密时动态绑定:
flowchart TD
subgraph build["构建流水线"]
A[Markdown 源码] --> B[Astro 流水线]
B --> C[渲染 HTML]
C --> D[encryptProtectedContent]
D --> E[ProtectedPayload]
E --> F[含 ProtectedPost 的静态 HTML]
end
subgraph runtime["客户端运行时"]
G[读者访问页面] --> H{会话是否有效?}
H -->|是| K[渲染解密后的 HTML]
H -->|否| I[显示 PasswordGate]
I --> J[用户提交密码]
J --> L[Web Crypto AES-GCM 解密]
L -->|失败| M[给出错误反馈]
L -->|成功| N[写入会话记录]
N --> K
K --> O[触发解密后协调器]
O --> P[初始化复制、Mermaid、KaTeX 与目录]
end2.3 LaTeX 数学公式
行内公式:欧拉恒等式 与高斯积分 。
块级公式会带有横向滚动容器:
2.4 提示块
2.5 GitHub 仓库卡片
3. 配置参考
| 参数 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
encrypted | boolean | 否 | false | 显式标记该文章为加密文章。若设置了 password,则隐含为 true。 |
password | string | 是 | 无 | 构建时用于加密、运行时用于解锁的明文密码。 |
passwordHint | string | 否 | "" | 可选提示,显示在密码输入框下方。 |
hideHomeContent | boolean | 否 | true | 在列表卡片、归档与 RSS 订阅中隐藏文章描述与字数统计。 |
4. 小结
本次演示验证了 Shirone 完整的加密生命周期:静态产物零明文、可靠的密码学校验、会话在导航与刷新之间的持续保持,以及运行时对富内容的动态重建。
分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 70 天
部分内容可能已过时

评论
0 条评论