目前开源的博客框架很多种,从架构来分,大致分为两种
一种生成纯静态页面的无后台博客(例如 hexo,vuepress 等)
另一种是用户后台管理的博客框架(例如 wordpress,typecho 等)

本文主要以 hexo(或者静态 html 博客) 为主

什么是 Hexo

如果你不知道什么是 Hexo,这篇文章同样适合你,本文主要讨论如何实现对博客文章加密。hexo 最终也是生成静态对 html 文件。

Hexo 是一个快速、简洁且高效的博客框架。

Hexo 的特点:

  • 超快速度 - Node.js 所带来的超快生成速度,让上百个页面在几秒内瞬间完成渲染。
  • 支持 Markdown - Hexo 支持 GitHub Flavored Markdown 的所有功能,甚至可以整合 Octopress 的大多数插件。
  • 一键部署 - 只需一条指令即可部署到 GitHub Pages, Heroku 或其他平台。
  • 插件和可扩展性 - 强大的 API 带来无限的可能,与数种模板引擎(EJS,Pug,Nunjucks)和工具(Babel,PostCSS,Less/Sass)轻易集成

加密方式

无后台

你可能没有自己的域名,可能没有自己的服务器,你只是使用了 (Github,Gitlab,Coding,Gitee 等) Pages 服务。

伪加密

第一种加密方式,我叫它伪加密,正如它的名字,它不是真正的加密,只是做了一个伪装。

所谓实现方式,就是在文章前面加上一个遮罩层,待输入正确的密码,再将遮罩层隐藏。

你可能会说:“你是在逗我吗?稍微懂点技术的人,分分钟就能破解了”。

所以这种加密方式只适用于,非技术内博客,且对安全性要求不高(感觉这种"加密"基本没什么X用)

绝对加密

这种方式相对来说很安全了,先说一下加密过程:

  1. 对原始密码(password)进行非对称加密(假设用 Md5) md5Password = md5(password),生成 md5Password
  2. 使用原始密码对文章 html 文本进行对称加密(假设使用 DES)
1
2
3
4
5
6
DESHtml = CryptoJS.DES.encrypt(
html, CryptoJS.enc.Utf8.parse(password),
{
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});

解密过程:

  1. 对用户输入的密码进行校验,得到正确的明文密码(password)
  2. 使用 DES 算法解密得到 html文本
1
2
3
4
html = CryptoJS.DES.decrypt(message, password, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
  1. 将得到的 html 渲染到 dom 中。

可以这种方式已经是很安全了,为了增加安全性,我们可以对加密算法进行优化(比如对 md5 算法加 salt)

有后台

有后台就很好办了,想怎么玩就怎么玩,让用户登录也好,输入密码也好

伪加密升级版

将伪加密的 dom 交由后台管理,调用后台接口,验证通过返回 html,再渲染到 dom 中即可
但是这种方式实现起来复杂,增加部署成本

需要将文章的 html 从静态文件中抽取出来保存到数据库(数据库中至少还要包括 密码,url等信息),
然后为这些 html 增加 请求后台接口的代码。
至于静态文章可以部署到 Pages 服务中.

过滤器拦截

这种方式可以对文章进行分类,对于需要加密对文章放在统一对 url 下,通过 url 进行拦截过滤,验证密码或者验证身份.
同样是使用原始对静态文件,只是由 web 服务器控制访问。

这种方式部署方式不变,一般都是 ftp 上传到个人服务器。


当然还有很多方式实现加密,还有一些实现起来太复杂,对于有需要对博客加密的胖友可以拿来参考。