这次拆的是中行TOTP密码器,基本原理是根据初始密钥和时间,每60秒生成一个6位数密码,服务器端按同样规则生成密码,验证时和用户端生成的密码进行对比,如果一致就验证通过,所以密码器需要内置电池,并且电池不可更换,用来保持内部时间准确,所以这种密码器有有效期限制,就是内部电池能够正常维持工作的时间。因为服务器时间可以认为是一直准确的,密码器内部时间可能根据环境不同会有误差,所以一般服务器端会有时间误差补偿,在生成验证密码同时生成这个时间前后几分钟对应的验证密码,对用户输入密码验证的同时计算密码器时间和服务器端时间的误差,并记录用作密码器端时间误差补偿。在比较早期的密码器上,比如200x年的网易将军令,服务器端会提供手动时间误差补偿功能,就是让用户输入连续两次产生的密码,用来进行服务器端的时间误差补偿,近些年可能是技术进步,使在整个使用寿命中密码器的时间误差不足以影响使用,所以没有见到手动时间补偿功能了。更详细的介绍可以参考Wikipedia【https://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm】。
为了防止密码器被物理攻击,密码器外壳使用了比较结实的塑料,上下两部分外壳之间是超声波焊接,并且里面采用注胶密封,这样同时起到防水防冲击的作用。揭开表层塑料膜之后并没有螺丝,所以要拆开只能使用暴力破坏外壳的方式。记得早期的网易将军令外壳很容易拆开,只要能保持密码器不断电就可以更换电池,延长使用寿命。对于现在的多数密码器这种方法已经不行了。
揭开表面塑料膜后在屏幕上方能看到5个圆孔,里面是电路板上的触点,用来写入初始密钥的。因为密码器是密封的,并且不能泄露初始密钥,所以要在生产完成后通过这几个触点向密码器写入初始密钥。密码器生产完成后就一直保持上电状态,初始密钥存在内部芯片的RAM中,断电后就会消失。
可以看到电路板上几个触点和外壳的圆孔是对应的,上面没有盖胶,其他部分都被塑料覆盖。电路还是很简单的,背面黑色的一块就是芯片,根据时间和初始密钥计算验证密码,并显示出来。
RFC 6238规定了TOTP算法详情,所以有兴趣的话可以据此自己写密码器。