Day 3414 用Arduino制作RFID钥匙链
很多人对管理密码感到由衷的麻烦,在生物特征验证尚未完全普及的今天(好像迄今为止做的最好、最为人所知的就是专属于iPhone 5S起的Touch ID),假设服务商没有(被迫)采取明文存储密码的2B做法,那么密码太短可能很容易被猜解出来,而密码太长又很容易记不住,而且在输入时也很麻烦。
因此有许多基于软件的密码管理器出现了(如1Password),只要记住一个主密码,剩下的密码都由其负责管理,并且很多优秀的产品已经出了很多平台的版本,可以跨平台进行使用,然而这种方式仍然有一点局限性:
- 在程序无法运行的环境下无法使用,例如:使用TrueCrypt加密的系统分区,在开机时要求输入密码;
- 主密码是拥有一切的前提,换句话说,如果忘记了主密码又没有备份,那么所有的密码可能都要丢失掉;
- 很多人有对商业软件与生俱来的不信任,在米国的棱镜项目被揭露后尤其如此。
我一直觉得很奇怪,为什么没有一种硬件,将密码离线存储在诸如IC卡之类的外部存储设备上,在需要的时候只要读卡,就能能模拟真实的键盘将密码输入。经过一番搜索,发现这种东西可能早就有了,只是没有供个人使用的商业化产品出现,其中的一个例子就是Mooltipass。
Mooltipass是一款设计精良的硬件密码管理器,除了实现以上所述的功能外,还能在适合的环境下与插件配合进行自动登录、帮助用户生成强密码(并存储下来供下次使用)。当时看到这款产品时,它还处在早期研发阶段,后来上了Indiegogo众筹。我没有双币卡,而且看到众筹也晚了些,$80的价格对我来说也有点贵(虽然说真的,值这个价钱),并且关于International Shipping说得好像也不是很清楚,所以就这么错过去了。
后来我听说了Arduino这个电子积木,其使用一种近似C的语言进行编程,并且通过一些方式可以模拟USB键盘。虽然我不会写C,但懂一点C#,两者有共通之处,所以二话没说就买了一堆零件开始尝试。
在拖延症和急功近利心理的共同作用下,一共走了以下几个弯路:
- 买错型号:设计上我想让成品既能读卡,又能写卡,但买了一圈之后我才知道能同时模拟USB键盘并与SPI总线上的RFID读卡模块RC-522通讯的型号是Arduino Leonardo,等我终于意识到时,已经额外买了Uno和Nano了。
- 多买了许多零件:跟以上理由相同,一开始以为需要用V-USB去模拟USB键盘,所以电阻、稳压二极管等等买了一大堆,最后才买到真正需要的东西。
虽然造成了许多不必要的支出,但最终这个东西还是做出来了,只有两个基本功能:
- 读卡,并将解密后的数据模拟键盘输入。
- 写卡,将加密后的明文(最长16位)存储到RFID标签中。
真正用到的元器件成本如下:
- Arduino Leonardo R3(¥30)
- 3×4矩阵键盘(¥5)
- RFID读卡模块RC522(含2张S50卡)(¥18)
- 无源蜂鸣器1枚(¥4)
- 公对母杜邦线一堆(¥5)
- 10K单联电位器(¥0.5)
- 8.5×5.5cm面包板(¥4)
- 1602 蓝色背光LCD(¥8)
合计¥74.50元——这么一算好像也不便宜,但是如果从一开始就核算成本,以自己的惰性怕是永远也做不出来。
不过以后输入16位长的密码简单些了。
源码和接线方式就算了,写的太烂。
2015-08-16更新:由于我手太笨,一直学不会焊接,所以这东西的最终形态是:







