按:本文产生于和Carneades同学讨论安全的锁具时的一些想法,其中一些当然是很久以前就产生的了。这里集中整理一下设计的理念和实现方法。
我们假设有这样一个锁,它已经锁上,而且有了各种良好的性能以致于我们很难破坏它。我们从这里分析和整理可能进行的攻击方式,以便设计一种可以应对这些问题锁具。
对于控制锁舌或者其他类似构件、需要我们出示凭证,证明自身的身份以便使之产生动作解锁的装置,可能发出的攻击有:
- 伪造,即伪造凭证,例如常见钥匙锁的撬法
- 破坏读取装置,例如用热固性物质塞入钥匙锁的锁芯
- 机械冲击,比如试图砸碎金属壳或者让锁内电路破坏
- 广义上的冲击,比如对于电子锁,施以高压电、电磁脉冲干扰、高温、注水或腐蚀剂、超声波等
- 穷举破解,对于特定的电子锁来说,穷举其可能的密钥
- 拆解,比如有些门锁就有这一问题
- 消耗,比如长时间试图解锁导致电力的消耗
- 强力,例如强力拉动门以使锁具脱落。
对于上述装置控制的其他部件,比如链锁的铁链,仍有一种可能的攻击,例如将其锯断或者砸碎,这同样归入(3)机械冲击中。
下面针对上面的可能攻击,设计自行车锁。为了避免(2)的问题,应当一种读取设备的接口不容易被破坏的设计。常见解锁方式:钥匙、磁卡、IC卡都有这一问题。射频卡或者无线信号解锁基本避免了这一问题。考虑采用电子方式制作锁是有优势的。
但是对一自行车锁,使用射频卡或者无线信号读取,又存在不能避免(7)的消耗的问题,例如锁中的电池耗尽,而如果能更换,也可能顺便带来(6)可以拆卸的问题。为了解决这一问题,决定不在锁具中内置电源。因此,锁具应当做成不可拆卸的,最简单的方式是焊接外壳或者外壳上的部分。采用方案如下:在生产时外壳为两块金属,可以通过焊接构成一个金属腔,而电路就放在腔里。一块半壳上通过某种装配方式安装一个和半壳主体绝缘的电极,这个电极也是有机械强度的。可以参考南孚电池正负极及聚能环的形状设计。
注意到这样的读取装置,也并非没有(2)的问题。例如攻击者在读取电极上焊接罩子使之无法访问。
为了解决(3)和(4)中有关机械强度的问题,外壳应当采用适合的材料以具有足够的抗冲击、抗腐蚀、防水、电磁屏蔽性能。也最好能解决(6)的部分问题。
解决(8)的问题,需要在锁内设计一套机械,使得电磁铁等力量相对较弱的机械零件不直接承担锁具上传入的力。电磁铁只控制解锁机构的关键部件,而通过连杆等机构让电磁铁上承担的力较小。
锁内电路和钥匙的通讯方式如下:锁的两个电极接入钥匙上的直流电源。在电源正极上调制一个幅值1V的方波。频率或者是100Hz,或者是1kHz,每种情况持续至少1ms。在锁内,通过一个电容滤波,得到这个纯交流信号;通过整流,得到了可供电磁铁动作的直流电。
锁内单片机对交流信号在0.2ms内采样数次,如果发现都是低频,就认为输入了一个0,如果都是高频,就认为输入了一个1。如果都有,就认为这次采样无效。如果上次获得的是0而本次也是0,则不进行记录。上次是1本次也是1,也不记录。只有两次相异,才计入一个新的信号。
这样,就可以让单片机和外面通信。单片机内部可以存储一定长度的密码本D
(这是和钥匙共享的)。开锁时钥匙中的系统首先发出请求,锁中的系统相应请求,产生一个随机数s
发回。钥匙系统从密码本D
中选取一段长度l
,起始位置p
的数据d
(即d=d(p,l)
),用HMAC方法求得h=HMAC(d,s)
,发给锁的数据为h
, p
, l
(l
可以省略,如果事先约定)。锁计算h’=HMAC(d(p,l),s)
,发现h’=h
,则开锁,否则拒绝。
因为s
不是任意选取的(需要锁上系统的同意),d
又非不共享密码本而可知,HMAC函数可以使d
, s
不能通过h反推,所以旁人是不能开锁的。
旁人即使截获了一次通信中的h
, p
, l
,也不能重放,因为每次要求的s
不同(或者说,钥匙即使每次打算选择同样的p
和l
,即同样的d
,发出的h
也因s
而异)。从h
, p
, l
, s
中也不能得到d
,所以传输的数据不能反推得到密码本。
硬件上,电路元件性能要高,对输入部分要有很好的保护措施,防腐蚀、防异常高的电压。金属表面要有高硬度和耐磨性,心部韧性要好。现有技术应该能让电路很容易抗冲击。
现在没有解决的问题是高温破坏和读取设备破坏。不过根据上述设计,这个锁自身可能较沉,那么可以固定在车体上,以便降低加热的影响。或者锁具内部是真空,电路重要部分悬空安装,其他地方用耐热材料。当然,电极的绝缘材料也必须耐热。