真正的協(xié)議漏洞通常要比這種密碼學(xué)方面的漏洞更容易攻擊,至少2家廠商都犯了一個(gè)錯(cuò)誤——?只檢查Nonce與上次發(fā)送的是否相同,由此,假設(shè)給定兩個(gè)有效碼A和B,則序列ABABAB…就被視為一系列獨(dú)立的有效碼。對(duì)于車鎖,小偷只要重放倒數(shù)第二個(gè)碼,就可以把門打開。另外還有一個(gè)預(yù)付費(fèi)儀表的例子,英國的一百多萬個(gè)家庭,加上發(fā)展中國家的數(shù)百萬的家庭,都安裝了可接受加密令牌的電表和煤氣表,這樣,把加密卡牌買回家插到表里就可以使用相應(yīng)數(shù)量的電和煤氣。在南非,有一種廣泛使用的電表只檢查解密命令中的Nonce是否與上次相同。這樣的話,顧客買兩個(gè)小額電票,再反復(fù)地交替使用,就可以充電到最高值[59]。
因此,使用隨機(jī)數(shù)還是計(jì)數(shù)器,這個(gè)問題并不像看起來那么簡單[316]。如果使用隨機(jī)數(shù),鎖必須記住前面很多個(gè)碼,人也必須記住,以防止隨從攻擊(valet attack),這種攻擊中,某些具備令牌臨時(shí)訪問權(quán)限的人(比如代客泊車的服務(wù)員)可以記錄下很多訪問碼,之后進(jìn)行重放以偷走你的車。如果需要記住數(shù)百個(gè)甚至數(shù)千個(gè)舊碼,可能就需要足夠的非易失性存儲(chǔ)機(jī)制,比如價(jià)格不菲的微控制器,這難免要為你的鎖增加一些成本。
如果愿意使用計(jì)數(shù)器,那么就要面對(duì)同步問題。一把鑰匙可用在多把鎖上,受口袋中物品擠壓時(shí)也可能激活(有一次我把實(shí)驗(yàn)令牌帶回家,結(jié)果因?yàn)楸还芬Фせ盍?。因此,如果計(jì)數(shù)器遞增了幾百甚至幾千次以后,就必須有復(fù)位機(jī)制。如果在一定條件下讓鎖向鑰匙“學(xué)習(xí)”,或與其保持同步,這就可以轉(zhuǎn)化為優(yōu)勢(shì),但是細(xì)節(jié)一般都設(shè)計(jì)得不完善。普通的產(chǎn)品使用16位計(jì)數(shù)器,只要譯碼以后計(jì)數(shù)器的值比最后一次使用時(shí)增加了不到16就可以訪問。有時(shí)鑰匙在別處使用了(或者被寵物抓到)16次以上,為了處理這種情況,倘若比起上次輸入有效碼時(shí)增加的值是17~32 767,鎖就打開第二個(gè)區(qū)間(計(jì)數(shù)器采用循環(huán)方式,65 535的下一個(gè)數(shù)是0)。在很多應(yīng)用程序中,上述處理方式可以有效工作,但實(shí)際上,攻擊者只需要獲取6個(gè)選定的訪問碼——?比如0、1、20 000、20 001、40 000和40 001,就可以完全突破系統(tǒng)。因此,必須仔細(xì)斟酌威脅模型中是否包含可以獲取訪問碼(與選定計(jì)數(shù)器值相對(duì)應(yīng))的主體——?他可以耐心等待時(shí)機(jī),也可以通過硬件攻擊方式實(shí)現(xiàn)這一目的。
一個(gè)近期的設(shè)計(jì)失敗實(shí)例來自TinyOS,這是一個(gè)用在傳感器網(wǎng)絡(luò)(基于IEEE 802.15.4 ad-hoc網(wǎng)絡(luò)標(biāo)準(zhǔn))中的操作系統(tǒng)。常用的TinySec庫(用于安全協(xié)議)中包含3個(gè)計(jì)數(shù)器(而不是1個(gè)),第1個(gè)因?yàn)楸粺o線射頻芯片驅(qū)動(dòng)程序重寫而丟失,第2個(gè)沒有被接收方記住,而盡管第3個(gè)可以正常工作,但該計(jì)數(shù)器用于保障可靠性而非安全性,因此,如果有人對(duì)流量進(jìn)行篡改,則輸出將是“錯(cuò)誤”而非“警告”,而網(wǎng)絡(luò)也將在錯(cuò)誤計(jì)數(shù)器的作用下失去同步[340]。
因此,即便設(shè)計(jì)一個(gè)簡單的令牌身份驗(yàn)證機(jī)制也并非那么簡單。有很多種攻擊方法并不需要“破壞”加密機(jī)制。隨著加密身份驗(yàn)證機(jī)制的使用日益增加(負(fù)責(zé)設(shè)計(jì)和實(shí)現(xiàn)身份驗(yàn)證機(jī)制的很多程序員都把問題看得過于簡單,例如連閱讀本書這樣的事情都不愿意去做),這類攻擊會(huì)變得很常見。
另一個(gè)關(guān)于身份驗(yàn)證的重要實(shí)例是“附件控制”。很多打印機(jī)廠商在打印機(jī)中嵌入了身份驗(yàn)證機(jī)制,以便保證其打印機(jī)使用原裝的墨盒。如果打印機(jī)被裝載了競爭對(duì)手的產(chǎn)品,打印機(jī)的分辨率就會(huì)從1200dpi降到300dpi,或者干脆拒絕工作。移動(dòng)電話的一大部分利潤來自于充電電池,其中也使用了身份驗(yàn)證協(xié)議,以便識(shí)別競爭對(duì)手的產(chǎn)品,使其無法工作,甚至讓它消耗得更快。其他相關(guān)行業(yè)也都逐漸開始采用這些機(jī)制,在汽車馬達(dá)貿(mào)易中,有言論要求對(duì)主要的備用部件進(jìn)行身份驗(yàn)證。第22章將和版權(quán)與權(quán)限管理一起對(duì)這些問題進(jìn)行深入討論,這里,我只想說安全機(jī)制正越發(fā)廣泛地應(yīng)用于商業(yè)模型,包括附件控制、權(quán)限管理、產(chǎn)品綁定與集成等。盲目地認(rèn)為只要有安全協(xié)議就一定能“御敵于外”的想法是錯(cuò)誤的。安全機(jī)制正日益廣泛地用于對(duì)設(shè)備(安全機(jī)制構(gòu)建在其中)的合法擁有者進(jìn)行約束,其目的可能存在法律上的疑點(diǎn)或與公開策略相反。