有时候有些不好意思公开的内容,想放在博客里方便自己查阅,那就只能加密了。在 github 找轮子果然找到一个 https://github.com/Li4n0/hugo_encryptor/

之前在使用 even 主题时就尝试过这段代码,但当时只能加密没办法解密,后面作者很热心的帮忙查看了问题,是由于 Hugo 版本问题导致,已经在后续修复。

加密分析

看看 hugo-encryptor.py 到底做了什么?

  1. 首先 AESCrypt类 利用了 AES 算法对内容进行加密,AES 算法的具体实现可参考之前网络安全的期中复习2.3 AES
  2. main 函数首先在 /public 文件下查找所有 .html 文件(包括子文件夹内),然后查找 html 文件中是否存在以 hugo-encryptor-cipher-text 为名的 <div> 标签。因为有可能存在很多个这样的板块,所以需要一个个处理。
  3. 对于每一个找到的模块,首先对用户设置的密码做哈希,得到的信息摘要作为 AES 算法的密钥。加密的内容自然作为 AES 算法的文本,加密后使用 base64 编码。
  4. 原来的模块存在 data-password 字段,前面已经用完了,所以得把它删掉,不然的话就暴露了!
  5. 对每一个模块都进行这样的处理后,最后要加上 <script> 标签,里面包含了用 js 写的解密函数。因为用到了 CryptoJS,还需要引用一下它的源。
  6. 这样一个被加密的文章的 html 页面就制作完成啦~
  7. 除了被加密的页面,还有其他地方需要修改,比如 public/index.xml, public/rss.xml, public/feed.xml。主要是为了解决在文章 summary 中放置加密内容的问题,我不会这么做,所以加不加也没什么关系了。

shortcodes 分析

首先 shortcodes 是什么东东呢?康康官网的定义:

Shortcodes are simple snippets inside your content files calling built-in or custom templates.

联想一下 Alfred 的 snippets,也就是通过简单的字段来代替冗长的内容。

看到第一行代码我就懵了,查找到了文档说 {{ $_hugo_config := `{ "version": 1 }` }} 用于想使用旧版本的 shortcodes 的行为,本来 % 和 < 效果一致,后来在 Hugo 0.55 版本中 % 会提前被渲染,具体情况查阅这里。我其实有点疑惑,这里真的需要旧版本吗?当 shortcodes 被替换的时候内部内容应该还是 md 文件吧,还没有被渲染过吧?

shortcodes 的替换内容还是很容易理解的,注意一点 <span style="display: none;">--- DON'T MODIFY THIS LINE ---</span> 这个连同内容一起被加密,所以在加密状态下 html 页面没有该结构,解密后这部分的存在也有助于验证解密的正确性。

netlify 部署

分析比较容易,但做起来我又愁了,因为我采用的是 netlify 的无脑部署。我该怎么配置部署文件使得每次 build 后,执行 hugo-encryptor.py 文件呢?

我需要执行的命令如下:

chmod +x hugo_encryptor.py
pip install -r requirements.txt
hugo
python3 hugo_encryptor.py

我需要做的就是修改 build command 为这一系列命令的叠加,但是一直报错,主要原因是版本问题,在文档的指导和我的不断实践下,终于搞定,具体设置如下:

[build]
publish = "public"
command = "hugo --gc --minify && pip install -r requirements.txt && chmod +x hugo-encryptor.py && python hugo-encryptor.py"

根目录下还需要再加一个 runtime.txt 文件,用于设置 python 的版本。

OK!大功告成啦~