嵌入式系統的安全性
本文作者:admin
點擊:
2009-08-14 00:00
前言:
簡介
與大多數人一樣,我經常會擔心個人資料儲存在那些不安全的系統上,這將導致個人資訊可能遭到竊取。這些可能造成資料失竊的系統包含各種裝置,如信用卡掃描器、收銀機系統、醫療系統,以及其他非零售的裝置。然而,除了上述這些系統之外,仍有相當多其他裝置都會儲存重要資料,如果沒有妥善保護這些資料,可能就會威脅到日常生活。這些裝置包括如電梯控制、交通號誌系統、電力網路等等。上述這些系統內部的所有通訊都需要針對資料的重要性採取不同層級的保護。
明顯的保護方法
對於維護嵌入式系統安全,我個人最青睞的保護方式包含了一個最基本的概念,即實體安全性。也就是說,如果你認為這些系統包含了重要的資訊需要特別保護,並且將這些資訊封鎖對外的通訊,則可大幅減少遺失資料的風險。簡單來說,就是將嵌入式控制器以及其他關鍵任務系統放在一個上鎖的房間或是安全的封閉環境中執行。這種保護措施可以應用在許多系統上,並讓系統可以受到控制,但因為仍採用開放式網路,因此容易造成系統運行效率下降、網路壅塞以及容易遭到攔截等問題。無論是採用實體網路或是無線網路,都可以採取這種保護模式,但也都會遇到相同的問題。對於提高安全性來說,我個人認為還是應該採用實體網路,有幾種簡單的方法可以保護通訊的安全,讓入侵時使用的關鍵資料幾乎毫無用處。
公開金鑰加密如RSA(該名稱來自麻省理工學院三位發明者名字字首, Rivest、Shamir和Adleman來命名)和橢圓曲線密碼學(Elliptic curve cryptography)不但可以提供較佳的保護,並確保運作的正確性。這些方法廣泛用於電子商務和其他需要高階加密的應用程式中。不過,此類架構的運算需求相當大,雖然可為嵌入式系統提供最安全的通訊,但需要付出的代價太高,並不見得適合於嵌入式系統應用。目前有好幾種技術可以用來將資料進行「混亂(hash)」處理,因此可以在儲存和傳送資料的軟體和硬體中加入此技術,使資訊更加難以攔截。
在嵌入式系統保護資料最簡單的方法就是在資料的儲存或傳遞時使用循環碼 (Rolling Code)來進行保護。循環碼的應用已經存在很長的一段時間(例如第二次世界大戰期間的Enigma密碼機),並已應用在許多裝置中,舉凡從車庫門遙控器到門禁卡等等。現代循環碼加密的工作原理是使用序列位移暫存器搭配 XOR 函數來產生具有決定性的虛擬亂數碼,但是難以利用逆向工程進行解碼。輸入至XOR函數的資料就是目前將傳送(或加密)的位元。該函數是完全可逆的,只要在一開始將已知的初始種子值鎖到暫存器即可。正如同其他的加密方案,這種技術需要對資料進行填補,以使其長度足夠而不致於洩露金鑰。此外,過長的訊息和虛擬隨機碼的產生器模式可能會洩露金鑰。而且由於此類加密的限制,網路內的大部分封包流量都將下降。
時間變異密碼
資料安全性的重點之一是要確保金鑰不會洩露。即使採用公開金鑰加密模式,如果洩露了私密金鑰,系統還是會被破解。想要確保金鑰永不洩露的一種簡單方式是持續發佈新的金鑰。要持續發佈新的金鑰,最好的方法是使用目前的時間。如果每個裝置都知道要在某一時間拋棄舊的金鑰,並開始使用新的金鑰,則會很難針對金鑰進行逆向工程,因為這些金鑰隨時都有過期的可能。這個保護模式的簡單應用就是飯店的房間卡。房間的門鎖是以程式設計方式來接受已編碼的鑰匙卡,但只有在入住的期間有效。電子鎖內部的時鐘將會廢止金鑰 (即使沒有其他人使用房間),或對鎖進行重新編碼。它會讓卡片金鑰在設定的期間外成為無效的金鑰。
現在,剩下的問題是如何確保每個人都知道現在的時間。有幾種方法可以達到這個目的。其一就是與主要時鐘進行同步,這需要使用一種通訊協定來保持目前的時間。可以根據金鑰更新的頻率來決定要採用哪一種通訊協定,舉例來說,這可能只是一個內含時間資訊(例如NTP或網路時間通訊協定)的簡單定期封包,或是更準確的通訊協定,例如IEEE1588精確時間通訊協定 (Precision Time Protocol,PTP)。PTP提供的準確度非常高,其中移除了GPS接收器或銫時鐘在每個節點的需求。乙太網路實體層裝置(如美國國家半導體的DP83640)會內建此功能,並且可以搭配任何媒體存取控制器(MAC)一起運作。
藉由使用已同步的時鐘,可以透過使用虛擬亂數碼(例如基於循環碼的虛擬亂數碼)的金鑰產生器經常更新金鑰。因此每一秒鐘都會產生新的種子,同時在該期間內傳送的所有封包都會使用該種子。唯一的問題是封包的傳送不具決定性。在大型的網路基礎架構或網際網路上,封包送達的實際時間會有很大的差別,因此需要一種機制來確保晚到的封包不會遭到拒絕。
我們可以使用滑動視窗相關性的方法來達成這個目標。也就是說,加密的封包應該在加密傳送的資料中內嵌校驗總和檢查碼,以驗證其內容正確性。此外,該封包的「存活時間」值將會設為視窗的尺寸(時間)。因此,當接收到某個封包時,解密引擎會知道本地時鐘的目前時間。接著會嘗試使用本地時間對封包進行解碼。如果解密失敗,則解密演算法會往回移動一個視窗的階段時間,並嘗試再次對封包的內容進行解密。理論上,這應該只需要針對兩地的時間延遲進行一到二次的同步化,但實務上最多會嘗試進行10到20次的同步處理。
如果封包無法解密,則表示傳送者無效,而且封包將被丟棄。由於種子值的頻繁變動,因此幾乎無法即時對資訊解密,或者由於種子值持續改變,使得封包與封包間的資料不具關聯性。此外,可以將這個功能內建到通訊軟體堆疊中,或直接內建在硬體中,使得逆向工程變得非常困難。即使知道所採用的方法,但由於缺少固定的種子值,將使得資料的解密變得極為困難。
結論
除了金融業之外,並非所有嵌入式系統都需要使用加密來保護資料,更令人感興趣的是非常容易實作之混亂方案的強度。藉由使用簡單的密碼和使用隨著時間改變的金鑰技術,就可以大幅提高關鍵嵌入式系統的安全性。設計人員可以在韌體或軟體中採用這些方案,並將加密演算法加入FPGA或CPLD中,這將使得密碼破解變得更加困難。