實(shí)現(xiàn)安全的USB傳輸
創(chuàng)建示例應(yīng)用
本示例基于Microchip USB固件示例中提供的自定義HID應(yīng)用示例。此應(yīng)用使用USB的人機(jī)接口設(shè)備(Human Interface Device,HID)類發(fā)送自定義數(shù)據(jù)。除固件外,還提供用C++編寫(xiě)的與設(shè)備對(duì)話的示例程序。本示例將使用PIC18F46J50 USB演示板(部件編號(hào)MA180024)作為硬件平臺(tái)。
加密前,使用任何USB協(xié)議分析儀均可查看通過(guò)總線發(fā)送的數(shù)據(jù)(見(jiàn)圖2)。在圖2中,主機(jī)正在發(fā)出獲取按鈕狀態(tài)的請(qǐng)求,演示板將返回狀態(tài)。第一個(gè)字節(jié)0x81指示此數(shù)據(jù)包是按鈕狀態(tài),第二個(gè)字節(jié)0x01表示按鈕未按下。
圖2 分析儀中的數(shù)據(jù)以普通視圖顯示,任何人均可查看
創(chuàng)建此示例的固件時(shí)應(yīng)執(zhí)行以下步驟:
將加密源代碼添加到USB應(yīng)用示例項(xiàng)目中;
將發(fā)送或接收的數(shù)據(jù)填充為16字節(jié)的倍數(shù),該值是此示例中使用的AES算法的塊大??;
創(chuàng)建加密/解密密鑰。此示例使用128位版本的AES,因此需要16字節(jié)密鑰;
對(duì)通過(guò)總線向外傳送的數(shù)據(jù)加密,而對(duì)接收自總線的數(shù)據(jù)解密。
圖3 與圖2相同的數(shù)據(jù)傳輸,但已經(jīng)過(guò)加密
在圖3中,字節(jié)1和2的含義并未改變,但已經(jīng)過(guò)加密。因此,沒(méi)有密鑰便無(wú)法在總線上解密字節(jié)1和2。此外,還增加了一個(gè)計(jì)數(shù)器,使每個(gè)數(shù)據(jù)包之間稍有不同。(后文將介紹為什么可能有人希望增加此功能。)
在數(shù)據(jù)傳輸?shù)腜C端,第一步是包含所需加密庫(kù)。這通過(guò)添加一個(gè)到內(nèi)置加密模塊的引用實(shí)現(xiàn)。使用固件中之前使用的密鑰創(chuàng)建加密/解密密鑰的實(shí)例?,F(xiàn)在,通過(guò)總線發(fā)送的數(shù)據(jù)將是安全的。這并不意味著系統(tǒng)也安全,但離這個(gè)目標(biāo)已越來(lái)越近。
重放攻擊
盡管發(fā)送的數(shù)據(jù)值現(xiàn)已安全,但由于有重放攻擊,系統(tǒng)仍然不安全。重放攻擊是指某人在捕捉發(fā)送的通信后重放相同的數(shù)據(jù)。在此處給出的示例中,某人可捕捉請(qǐng)求按鈕狀態(tài)的事件序列以及按鈕返回?cái)?shù)據(jù)包,并使用其創(chuàng)建設(shè)備來(lái)做出簡(jiǎn)單的加密響應(yīng),指示按鈕已按下。攻擊者無(wú)法判斷他們發(fā)送了哪些值,但能夠使USB主機(jī)認(rèn)為按鈕已按下。
前文所述的加密算法功能有助于保護(hù)此應(yīng)用。由于加密算法的設(shè)計(jì)機(jī)制,任何一位發(fā)生變化都會(huì)得到完全不同的塊值,因此可向每個(gè)數(shù)據(jù)包中加入一個(gè)隨機(jī)數(shù)。這會(huì)在通信過(guò)程中產(chǎn)生看似非常隨機(jī)的行為。雖然這不能完全消除重放攻擊,但它使應(yīng)用更加難以攻擊。有多種方法可實(shí)現(xiàn)隨機(jī)數(shù)功能,但都有各自的缺點(diǎn)。
從主機(jī)交換到設(shè)備的單個(gè)隨機(jī)數(shù)可在初始通信期間生成,該數(shù)字隨后會(huì)包括在發(fā)送的數(shù)據(jù)中。雖然這有助于使各會(huì)話間的數(shù)據(jù)看起來(lái)隨機(jī)化,但只要攻擊者確定出通信會(huì)話所采用模式,就無(wú)法防止他們劫持總線中間通信。
每次通信都可發(fā)送一個(gè)惟一的隨機(jī)數(shù)。雖然這使系統(tǒng)更難以破解(因?yàn)楣粽咝枰却阎?qǐng)求才能發(fā)送已知響應(yīng)),但它要占用更大的數(shù)據(jù)存儲(chǔ)空間。此方法只有在使用非對(duì)稱加密時(shí)才真正可行。如果使用對(duì)稱加密,則完整的請(qǐng)求和響應(yīng)表遲早會(huì)被發(fā)現(xiàn),最終破解也會(huì)變得輕而易舉。
基于PC的攻擊
對(duì)USB數(shù)據(jù)傳輸進(jìn)行加密有助于防止系統(tǒng)被破解,但只要有一個(gè)人成功破解系統(tǒng)并將破解方法公之于眾,任何人都能在將來(lái)進(jìn)行破解。
數(shù)據(jù)到達(dá)PC后,在處理敏感數(shù)據(jù)時(shí)仍然需要考慮一些注意事項(xiàng)。PC上沒(méi)有數(shù)據(jù)是安全的,即使其已經(jīng)加密。更為老練的攻擊者能夠編寫(xiě)應(yīng)用程序來(lái)掃描PC上的RAM,以尋找可能的密鑰或解密數(shù)據(jù)。如果在PC上解密通過(guò)USB發(fā)送的數(shù)據(jù),則在某一時(shí)刻,密鑰與原始解密數(shù)據(jù)將駐留在RAM中,從而可被應(yīng)用程序讀取。這需要更長(zhǎng)時(shí)間和更高級(jí)的專業(yè)技術(shù)才能破解,但仍然存在破解的可能性。在這種情況下,非對(duì)稱加密可再次幫助保護(hù)數(shù)據(jù),因?yàn)槠平庑枰脩粼诿看芜B接設(shè)備后都檢測(cè)新密鑰。但這仍然無(wú)法完全保護(hù)系統(tǒng)。
解密后的數(shù)據(jù)僅存在于安全設(shè)備的應(yīng)用最不可能被破解。此模型在某些應(yīng)用中尤為適用。例如,加密的自舉程序可加密安全服務(wù)器上的。hex文件,并且只在攻擊者無(wú)法觸及單片機(jī)時(shí)才在單片機(jī)上解密數(shù)據(jù)。再比如一個(gè)將捕捉的數(shù)據(jù)文件發(fā)送到PC的數(shù)據(jù)記錄器,其并不在本地解密數(shù)據(jù)和顯示結(jié)果,而是將加密數(shù)據(jù)通過(guò)Internet發(fā)送到安全服務(wù)器來(lái)解密數(shù)據(jù),然后將不含敏感數(shù)據(jù)的結(jié)果摘要返回給用戶。
總結(jié)
對(duì)于生成并傳輸惟一或隨機(jī)機(jī)密數(shù)據(jù)的應(yīng)用來(lái)說(shuō),可以用最少的成本輕而易舉地進(jìn)行加密。而靜態(tài)程度高、傳輸行為可預(yù)測(cè)的應(yīng)用則略難保護(hù)。在所有加密系統(tǒng)中,都不應(yīng)假定數(shù)據(jù)是安全的,而應(yīng)該通過(guò)加密阻止數(shù)據(jù)竊取。增加密鑰長(zhǎng)度、在數(shù)據(jù)載荷中加入隨機(jī)性以及非對(duì)稱密鑰交換等技術(shù)均可提高對(duì)潛在數(shù)據(jù)竊取的抵御程度。其他一些方法同樣有助于保護(hù)傳輸?shù)臄?shù)據(jù),這些方法各自均有優(yōu)缺點(diǎn)。在任何應(yīng)用中設(shè)計(jì)加密都需要在抵御程度與實(shí)現(xiàn)該抵御所需的成本之間找到平衡。
c++相關(guān)文章:c++教程
評(píng)論