使用 hexo-blog-encrypt 插件, 或 ngnix 反向代理设置密码认证, 达到需要一定门槛才能访问笔记的目的.
建议直接使用 ngnix 反向代理为某个域名加密. 搭配 page 类型文章使用体验更佳.
也可以使用 hexo-blog-encrypt 为笔记加密. 不过就像项目描述说的: 不够安全.
ngnix + page 方式
ngnix 配置
ngnix 反向代理能为某个域名设置 “需要认证”. 以该站点下 auth 路径为例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| # www, blog -> hexo[4000] server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.kers.site blog.kers.site;
ssl_certificate /etc/ssl/certs/full_chain.pem; ssl_certificate_key /etc/ssl/private/private.key;
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5;
location / { proxy_pass http://127.0.0.1:4000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
# 为 /auth 目录设置认证, 需要在 /etc/nginx/.htpasswd 中添加用户名和密码 location /auth { auth_basic "需要认证"; auth_basic_user_file /etc/nginx/.htpasswd; # 并不会继承配配置, 所以要重写一遍 proxy_pass http://127.0.0.1:4000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
|
这样添加帐户和密码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| sudo htpasswd -c /etc/nginx/.htpasswd username
sudo htpasswd /etc/nginx/.htpasswd username2
sudo htpasswd /etc/nginx/.htpasswd username
sudo chmod 640 /etc/nginx/.htpasswd sudo chown www-data:www-data /etc/nginx/.htpasswd
sudo chown nginx:nginx /etc/nginx/.htpasswd
|
Hexo 使用
Hexo 的 page 类型文章, 创建之后路径可控, 且无法从主页任何地方导航到此(只有你自己知道这个地址).
创建之后会自动生成一个 index.md, 作为页面的主页. 直接进入 hostname.com/auth 将显示该页面.
将任何文章放入该文件夹, 该文章将从正常的 Hexo 文章列表中消失(不能在分类, tag, 时间线等任何地方找到), 但是可以通过引用路径访问.
例如, 将 passwords.md 放入 auth 文件夹, 然后路径下有这些文件.
1 2 3 4 5 6 7
| hexo |-- source | -- auth | -- index.md -- passwords.md
|
可以直接在 index.md 下, 如此引用, 以导向 passwords.md:
注意不需要 .md 后缀.
直接使用链接也行: www.kers.site/auth/passwords.
别试了, 当然不可能是真实路径.
hexo-blog-encrypt 方式
这里是 hexo-blog-encrypt 的项目地址.
可以直接去查看官方快速使用文档, 这里基本上是其摘录.
注意如果是其它人的设备, 用完记得清除浏览器缓存的站点数据. 否则他下一次进入时不需要密码.
安装 hexo-blog-encrypt
1 2 3 4
| cd ~/hexo
npm install --save hexo-blog-encrypt
|
快速使用
将 password 字段添加到您文章信息头, 就像这样:
1 2 3 4 5
| --- title: Hello World date: 2016-03-30 21:18:02 password: hello ---
|
需要重启生成文章, 重启服务器, 才能最终看到效果.
清除浏览器站点数据
如官方文档描述的一样:
一旦你输入了正确的密码, 它将会被存储在本地浏览器的 localStorage中. 按个按钮, 密码将会被清空.
通用做法是: 站点页面上点击地址栏左侧锁形图标 → 站点设置/权限 → 清除站点数据.
高级设置
文章信息头中可用的高级设置
1 2 3 4 5 6 7 8 9 10 11 12
| --- title: Hello World tags: - 作为日记加密 date: 2016-03-30 21:12:21 password: mikemessi abstract: 有东西被加密了, 请输入密码查看. message: 您好, 这里需要密码. theme: xray wrong_pass_message: 抱歉, 这个密码看着不太对, 请再试试. wrong_hash_message: 抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容. ---
|
配置通过标签加密
在 _config.yml 中可以加入以下字段:
1 2 3 4 5 6 7 8 9 10
| encrypt: abstract: 有东西被加密了, 请输入密码查看. message: 您好, 这里需要密码. tags: - {name: tagNameA, password: 密码A} - {name: tagNameB, password: 密码B} theme: xray wrong_pass_message: 抱歉, 这个密码看着不太对, 请再试试. wrong_hash_message: 抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.
|
然后在需要加密的文件的信息头中添加对应标签, 该文章即被加密.
文章信息头中的配置, 优先级更高.
可用的主题
另外
Hexo 设计的目的是公开博客, 包括所有插件也是如此. 不建议在 Hexo 服务器上写 “密码本” 或 “日记” 等需要加密的内容. 我使用的过程中就遇到了如下问题:
一个评论区插件, Gitalk需要连接到 GitHub 仓库, 由于我无法将含有文档的仓库本身公开, 因此不得不新增实体, 创建一个空仓库专门用于存储评论.
一个搜索插件, hexo-generator-searchdb 无法更加精确地划分搜索范围, 如果配置它能搜索到 page, 它将能搜索到所有 page, 包括加密的 page. 这意味着, 访客无需查看文章, 通过关键字就能间接看到隐藏文章.
如果某个东西这么值得加密, 也许用不到 Hexo 的额外管理和界面渲染, 直接放在服务器某个路径上, 通过纯 html 访问, 也能接受, 不是吗?