小心被你敲鍵盤的聲音出賣
介紹
本文會(huì)講解一些關(guān)于keytap工具的技術(shù)細(xì)節(jié)。我也會(huì)分享一些自己關(guān)于這個(gè)項(xiàng)目的幾點(diǎn)想法。這個(gè)項(xiàng)目已經(jīng)開(kāi)源,源碼在這里可以下載。
描述
該工具的主要目標(biāo)是利用敲擊鍵盤時(shí)產(chǎn)生的聲音作為一種邊信道攻擊來(lái)猜測(cè)輸入文本的內(nèi)容。為了達(dá)到這個(gè)目標(biāo),該算法以訓(xùn)練集作為輸入,這個(gè)訓(xùn)練集包括音頻記錄和記錄期間你敲了哪些鍵盤按鍵。通過(guò)這些數(shù)據(jù),該算法可以學(xué)習(xí)到不同按鍵敲擊的聲音,之后就可以通過(guò)捕獲的音頻來(lái)嘗試識(shí)別敲鍵盤的聲音。訓(xùn)練數(shù)據(jù)集的收集非常具體,采集收據(jù)的根據(jù)也就是鍵盤、麥克風(fēng)還有兩者之間的相對(duì)位置。任何因素發(fā)生了變化,這個(gè)方法就變得毫無(wú)意義了。不過(guò)好在,當(dāng)前的方法可以進(jìn)行實(shí)時(shí)預(yù)測(cè)。
這個(gè)方法涉及到的主要步驟如下:
- 收集訓(xùn)練數(shù)據(jù)
- 創(chuàng)建預(yù)測(cè)模型,不斷學(xué)習(xí)
- 檢測(cè)到鍵盤輸入
- 預(yù)測(cè)具體的每一個(gè)輸入鍵
收集訓(xùn)練數(shù)據(jù)
這個(gè)收集訓(xùn)練數(shù)據(jù)的方法已經(jīng)忽略了兩次鍵盤敲擊之間的聲音。我們只保留實(shí)際按鍵前和按鍵后75-100ms的音頻。這樣做可能會(huì)有點(diǎn)不太精確,因?yàn)殒I盤敲擊的延遲時(shí)間是隨機(jī)的,程序捕獲這種事件,也會(huì)受到硬件和軟件因素的影響。
舉個(gè)例子,下圖是敲擊我鍵盤上的字母“g”的完整聲波:
從圖中可以看到,在按鍵峰值之后,還有一個(gè)釋放按鍵的峰值。而keytap直接忽略了這個(gè)釋放峰值。這個(gè)可能會(huì)提取到額外的信息,不過(guò)為了簡(jiǎn)單起見(jiàn),釋放峰值的這個(gè)數(shù)據(jù)就直接放棄不用了。所以,最終字母“g”這個(gè)按鍵的訓(xùn)練數(shù)據(jù)聲波圖如下:
當(dāng)然,這個(gè)75ms的間隙對(duì)打字速度有一定的限制,如果在這個(gè)時(shí)間段內(nèi),按鍵有重疊的話,不同按鍵的訓(xùn)練數(shù)據(jù)就會(huì)混雜在一起。
從上圖中還可以觀察到一點(diǎn)就是某個(gè)按鍵的訓(xùn)練聲波圖越多越好,結(jié)合多個(gè)聲波圖,可以幫助減少環(huán)境噪音。而且,每個(gè)人按鍵的聲音可能稍有不同,這就取決于用戶按鍵的方式了。所以,你可能會(huì)捕獲到某個(gè)按鍵的不同的聲音。
創(chuàng)建預(yù)測(cè)模型
這時(shí)候就體現(xiàn)出人們的非凡創(chuàng)造性了,可以通過(guò)機(jī)器學(xué)習(xí),人工智能和神經(jīng)網(wǎng)絡(luò)等技術(shù)來(lái)創(chuàng)建預(yù)測(cè)模型。不過(guò)keytap使用了最簡(jiǎn)單的一種辦法。對(duì)于每一個(gè)訓(xùn)練按鍵,我們執(zhí)行以下3個(gè)步驟:
1.對(duì)齊收集到的波形峰值。這有助于避免檢測(cè)按鍵之前的隨機(jī)延遲時(shí)間,前面解釋過(guò)了。
2.基于相似性度量來(lái)優(yōu)化聲波的對(duì)齊方式,因?yàn)橛袝r(shí)候,聲波的峰值并不是最佳指標(biāo),所以我們要選擇一個(gè)更加精確的方法。
3.對(duì)其波形進(jìn)行簡(jiǎn)單加權(quán)平均。權(quán)重由相似性度量定義。
我們并沒(méi)有直接跳到步驟2,而是要先執(zhí)行第一步,因?yàn)橄嗨菩远攘康挠?jì)算是很吃CPU的。而步驟1已經(jīng)有效的縮小了對(duì)齊的范圍并減少了計(jì)算量。
步驟3之后,我們最終會(huì)得到每個(gè)按鍵的平均波形。之后會(huì)將其與捕獲到的數(shù)據(jù)進(jìn)行對(duì)比并預(yù)測(cè)最有可能的輸入按鍵。
keytap中使用的相似性度量是交叉相關(guān)(CC),公式如下:
這里的Ai和Bi是被比較的兩種波形的波形樣本。CC值越高,波形越相似。當(dāng)然也可以使用其他的相似性度量的測(cè)試方法。
不同按鍵之間間隔的計(jì)時(shí)信息其實(shí)也可以加入到預(yù)測(cè)模型中,不過(guò)我避免了使用這種方法,因?yàn)樗与y以實(shí)現(xiàn)。
檢測(cè)鍵盤輸入
keytap使用相對(duì)簡(jiǎn)單的閾值技術(shù)來(lái)檢測(cè)原始音頻中的按鍵事件。顯然,當(dāng)用戶敲擊按鍵時(shí),我們預(yù)計(jì)會(huì)有一個(gè)很高的峰值,這也正是我們想要的效果。閾值相對(duì)于過(guò)去幾百毫秒的樣本平均強(qiáng)度而言是自適應(yīng)的。
這個(gè)方法并不是十分完美,但我現(xiàn)在還不知道更有效的方法來(lái)檢測(cè)按鍵事件。
預(yù)測(cè)敲了哪些按鍵
一旦確定了可能的按鍵事件,我們就可以定位到波形的峰值位置,計(jì)算該部分波形與訓(xùn)練數(shù)據(jù)中所有平均波形的相似性度量。我們?cè)试S在峰值附近有小范圍的調(diào)整(前面提到過(guò))。我們認(rèn)為相似性度量最高的將對(duì)應(yīng)的是敲擊的按鍵。
幾點(diǎn)觀察
我注意到即時(shí)這個(gè)算法沒(méi)有檢測(cè)到敲擊的正確按鍵,它仍然能夠預(yù)測(cè)到附近的按鍵,意思也就是定位到了正確鍵的下一個(gè)鍵。對(duì)于這個(gè)現(xiàn)象,我認(rèn)為有下面兩種解釋:
1.鍵盤上相鄰的按鍵發(fā)出的聲音類似
2.在這個(gè)方法中,鍵相對(duì)于麥克風(fēng)的位置對(duì)預(yù)測(cè)起著決定性的作用
我認(rèn)為第一種解釋不太可能,所以很可能是第二種解釋。
另外,我還觀察到機(jī)械鍵盤比非機(jī)械鍵盤更容易遭受這種鍵盤竊聽(tīng)攻擊。
keytap2
我很篤定肯定有一種實(shí)現(xiàn)預(yù)測(cè)的方法是根本不需要收集訓(xùn)練數(shù)據(jù)的。假如用戶使用某種已知語(yǔ)言來(lái)輸入文本,比如英語(yǔ),那么關(guān)于該語(yǔ)言的N元模型統(tǒng)計(jì)信息和按鍵檢測(cè)的相似性度量值結(jié)合起來(lái)就足夠檢測(cè)出輸入的文本了。實(shí)際上,歸根到底這其實(shí)就是破解置換密碼的一種攻擊。
keytap2嘗試著去證明這種攻擊。我也在做這方面的研究,但是我卡在了基于他們的CC公式對(duì)按鍵進(jìn)行聚類分析的部分。但我認(rèn)為至少我已經(jīng)準(zhǔn)備好了置換密碼破解工作。如果在實(shí)際中破解成功的話,我將會(huì)提供更多的細(xì)節(jié)。
結(jié)束語(yǔ)
科學(xué)文獻(xiàn)上,關(guān)于這個(gè)主題的論文有很多。其中有一篇論文中的一個(gè)特別的方法給了我很大的啟發(fā),就是Don’t Skype&Type!大家有興趣的可以看看。但大多數(shù)情況下,我都是自己獨(dú)立解決了問(wèn)題,沒(méi)有閱讀別人論文中的細(xì)節(jié)和他們的研究成果,我覺(jué)得自己解決問(wèn)題更有意思,更有挑戰(zhàn)性。
老實(shí)說(shuō),真沒(méi)想到這篇文章會(huì)受到巨大的關(guān)注,完全在意料之外。這一切始于我在一篇Hacker News中發(fā)布的一條評(píng)論,然后被一個(gè)著名的開(kāi)發(fā)工程師注意到了。然后,我的Twitter消息就炸了。
不管怎樣,希望這篇文章對(duì)大家有所幫助,謝謝!