如何对博文内容加密?
有时候有些不好意思公开的内容,想放在博客里方便自己查阅,那就只能加密了。在 github 找轮子果然找到一个 https://github.com/Li4n0/hugo_encryptor/
之前在使用 even 主题时就尝试过这段代码,但当时只能加密没办法解密,后面作者很热心的帮忙查看了问题,是由于 Hugo 版本问题导致,已经在后续修复。
加密分析
看看 hugo-encryptor.py
到底做了什么?
- 首先
AESCrypt
类 利用了 AES 算法对内容进行加密,AES 算法的具体实现可参考之前网络安全的期中复习的2.3 AES
- main 函数首先在
/public
文件下查找所有.html
文件(包括子文件夹内),然后查找html
文件中是否存在以hugo-encryptor-cipher-text
为名的<div>
标签。因为有可能存在很多个这样的板块,所以需要一个个处理。 - 对于每一个找到的模块,首先对用户设置的密码做哈希,得到的信息摘要作为 AES 算法的密钥。加密的内容自然作为 AES 算法的文本,加密后使用 base64 编码。
- 原来的模块存在
data-password
字段,前面已经用完了,所以得把它删掉,不然的话就暴露了! - 对每一个模块都进行这样的处理后,最后要加上
<script>
标签,里面包含了用js
写的解密函数。因为用到了CryptoJS
,还需要引用一下它的源。 - 这样一个被加密的文章的
html
页面就制作完成啦~ - 除了被加密的页面,还有其他地方需要修改,比如
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!大功告成啦~