# Hugo 加密文章简单尝试
关于 Hugo 加密文章的简单尝试。
## 前言
我在使用 Hexo 的时候,注意到有一些加密文章相关插件。加密文章,在 Wordpress 等等有服务器支持的博客程序中是一个比较容易实现的功能,用户把密码口令发送到服务器验证,然后返回相关资源。但是静态博客,无后端的情况下,解密过程是在前端的,也就是无法对尝试次数之类的进行任何限制。这其实并不算很安全的一种方案。
即使如此也有其用途。在 Hexo 插件中,使用方法就是在文章 Metadata 加上一些字段就行了。也就说这种方法如果想保密不能公开源码。在 Hugo 这里要麻烦一些,Hugo 本身似乎并没有提供插件功能,也没有不修改源码就增加内置函数的功能。倒是找到了使用 python 处理的一些方法。
因此,我进行了以下尝试。
1. 把所有需要加密的初始文本片段,加入一个被 git 忽略的文件夹。
2. 运行一个脚本,或者手动使用加密工具加密,然后生成的密文填入一个 txt 文件中。
3. 生成的加密文件作为静态文件附件公开,一同随网站发布。
4. 写了个 Hugo 的 Shortcode 用于生成用户端解密显示,填入加密文件 URL 。
## Demo
这样在使用前端效果如下,口令是 hi
{{< xxtea url="/data/20231120.txt">}}
我使用的加密算法是 Xxtea ,这是一个很容易实现的算法。就博客文章加密场景,或许一个异或运算加密就足够了,这样能少引入一个 js 。不过 Xxtea 在网络上也有不少现成的加解密工具可以使用,也挺不错的。
Hugo shortcode 代码贴在下面,或者在我网站源码里也能找到。引入的 js 在 https://github.com/xxtea/xxtea-js
## 代码
Shortcode 代码
```html
{{- $url := .Get "url" -}}
{{- $md5Hash := md5 $url -}}
{{- $md5Short := substr $md5Hash 0 8 -}}
```
一个加密小程序,可以使用 Deno 运行
```js
// XXTEA 方法 XXTEA.encryptToBase64 XXTEA.decryptFromBase64
// https://github.com/xxtea/xxtea-js MIT license
// https://github.com/zhaidw/xxtea-ts MIT license
import XXTEA from "https://deno.land/x/xxtea@v0.1.0/mod.ts";
const fileName = "README.md";
const text = Deno.readTextFileSync(fileName);
const encrypted = XXTEA.encryptToBase64(text, "password");
Deno.writeTextFileSync(fileName + ".xxtea.txt", encrypted);
// deno run --allow-read --allow-write test.js
```
或者将一个文件夹内的文本文件,批量加密
```ts
// deno run --allow-read --allow-write xxtea-utils.ts
console.log("XXTEA 加密 CLI")
console.log(Deno.args);
import XXTEA from "https://deno.land/x/xxtea@v0.1.0/mod.ts";
const basePath = ""
const inputFilesPath = basePath + "kkbt/xxtea/"
for (const file of Deno.readDirSync(inputFilesPath)) {
console.log(file.name);
if (file.isFile) {
const text = Deno.readTextFileSync(inputFilesPath + file.name)
const data = XXTEA.encryptToBase64(text, "password");
Deno.writeTextFileSync(basePath + "kkbt/xxtea/output/" + file.name + ".xxtea.txt", data);
}
}
```