分类:舞影霞光

Day 10766 迟来的https启用

即日起,本站的Blog部分正式启用Let’s Encrypt签发的SSL证书,其它页面如“锟斤拷”域名、霞光之羽饭否机器人等页面,因实际上是静态页面,暂不列入启用范围。

由于本站采用的是非常实惠的虚拟主机(这种情况通常也称为网站主人没钱),且一开始并没有在主机的控制面板中找到相应的证书导入选项(直到现在也没有显示出来,是靠瞎猜误打误撞进去的),就一直将启动SSL搁置起来,没想到一放就是两三年。

大体就是这么一件小事。

Day 9937 中间人攻击式饭否消息过滤代理

这个东西的最初设计目标是:在不对某些人取消关注(加黑名单也会取消关注)的情况下,通过中间人攻击(不是唬人,其实本质就是篡改返回结果)为不支持消息过滤的饭否客户端(实际上,没有任何一款饭否客户端和官方界面有这个功能,据本人所知的唯一途径是Chrome插件Fanatic,但也只能对饭否网页版起作用)提供相应功能。

由于没有一款客户端支持自定义API地址,所以采取的方式是:在本地用hosts将API所在主机(api.fanfou.com)重定向,然后在目标服务器接受解析,等于欺骗一下客户端,让它以为连接的是官方的API服务器。

此外,既然是中间人攻击,那么其实想对返回结果做什么都可以,本来除了过滤特定人之外还想加入更多功能,可是写完就懒了。

代码写得很面条很烂,请多包涵。

使用方法(以Apache 2.4.4 + PHP 5.3为例):

1、将文件内容另存为UTF-8无BOM格式,文件名为index.php(或任何目标服务器支持的默认文档名)

2、确认PHP开启cURL扩展,Apache开启了Rewrite扩展,修改httpd-vhosts.conf(或Apache虚拟主机配置文件所在处):

<VirtualHost *:80>
    ServerName api.fanfou.com
    DocumentRoot "文件所在路径"
</VirtualHost>
<Directory "文件所在路径">
    Order Allow,Deny
    Allow from All
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    #-f的含意是将请求的路径当作文件来看待,由于-f会检测文件是否真实存在,所以!之
    RewriteRule ^(.*)$ index.php?reqf=$1 [QSA]
    #QSA == Query strings appended,即将原始Query String内容原样转发
</Directory>

3、配置主机,将api.fanfou.com绑定到刚刚配置的Apache服务器上。

4、在要使用该代理的客户端上,配置hosts文件,将api.fanfou.com指向文件所在的主机。 (更多…)

Day 9740 用Arduino制作RFID钥匙链

rfid_keychain

很多人对管理密码感到由衷的麻烦,在生物特征验证尚未完全普及的今天(好像迄今为止做的最好、最为人所知的就是专属于iPhone 5S起的Touch ID),假设服务商没有(被迫)采取明文存储密码的2B做法,那么密码太短可能很容易被猜解出来,而密码太长又很容易记不住,而且在输入时也很麻烦。

因此有许多基于软件的密码管理器出现了(如1Password),只要记住一个主密码,剩下的密码都由其负责管理,并且很多优秀的产品已经出了很多平台的版本,可以跨平台进行使用,然而这种方式仍然有一点局限性:

  1. 在程序无法运行的环境下无法使用,例如:使用TrueCrypt加密的系统分区,在开机时要求输入密码;
  2. 主密码是拥有一切的前提,换句话说,如果忘记了主密码又没有备份,那么所有的密码可能都要丢失掉;
  3. 很多人有对商业软件与生俱来的不信任,在米国的棱镜项目被揭露后尤其如此。

我一直觉得很奇怪,为什么没有一种硬件,将密码离线存储在诸如IC卡之类的外部存储设备上,在需要的时候只要读卡,就能能模拟真实的键盘将密码输入。经过一番搜索,发现这种东西可能早就有了,只是没有供个人使用的商业化产品出现,其中的一个例子就是Mooltipass。

Mooltipass是一款设计精良的硬件密码管理器,除了实现以上所述的功能外,还能在适合的环境下与插件配合进行自动登录、帮助用户生成强密码(并存储下来供下次使用)。当时看到这款产品时,它还处在早期研发阶段,后来上了Indiegogo众筹。我没有双币卡,而且看到众筹也晚了些,$80的价格对我来说也有点贵(虽然说真的,值这个价钱),并且关于International Shipping说得好像也不是很清楚,所以就这么错过去了。

后来我听说了Arduino这个电子积木,其使用一种近似C的语言进行编程,并且通过一些方式可以模拟USB键盘。虽然我不会写C,但懂一点C#,两者有共通之处,所以二话没说就买了一堆零件开始尝试。

在拖延症和急功近利心理的共同作用下,一共走了以下几个弯路:

  1. 买错型号:设计上我想让成品既能读卡,又能写卡,但买了一圈之后我才知道能同时模拟USB键盘并与SPI总线上的RFID读卡模块RC-522通讯的型号是Arduino Leonardo,等我终于意识到时,已经额外买了Uno和Nano了。
  2. 多买了许多零件:跟以上理由相同,一开始以为需要用V-USB去模拟USB键盘,所以电阻、稳压二极管等等买了一大堆,最后才买到真正需要的东西。

虽然造成了许多不必要的支出,但最终这个东西还是做出来了,只有两个基本功能:

  1. 读卡,并将解密后的数据模拟键盘输入。
  2. 写卡,将加密后的明文(最长16位)存储到RFID标签中。

真正用到的元器件成本如下:

  1. Arduino Leonardo R3(¥30)
  2. 3×4矩阵键盘(¥5)
  3. RFID读卡模块RC522(含2张S50卡)(¥18)
  4. 无源蜂鸣器1枚(¥4)
  5. 公对母杜邦线一堆(¥5)
  6. 10K单联电位器(¥0.5)
  7. 8.5×5.5cm面包板(¥4)
  8. 1602 蓝色背光LCD(¥8)

合计¥74.50元——这么一算好像也不便宜,但是如果从一开始就核算成本,以自己的惰性怕是永远也做不出来。

不过以后输入16位长的密码简单些了。

源码和接线方式就算了,写的太烂。

2015-08-16更新:由于我手太笨,一直学不会焊接,所以这东西的最终形态是:

封装形式为PBC,即Paper Box Container