7&&8
第七章 安全通道
一、安全通道的性質
定義(不是一個正式的定義):Alice和Bob之間建立的一個安全的連線。
性質1:雙向性:多數的連線都是雙向的,Alice給Bob傳送訊息,Bob也同樣會給Alice傳送訊息。
性質2:不對稱性:在實際系統中,可能一方是客戶端另一個則是伺服器,或者更簡單地採用發起者(發起安全連線的一方)和響應者。
二、金鑰
要實現安全的通道,必須有一個共享的金鑰。
對金鑰有如下要求:
(1)只有Alice 和 Bob 知道金鑰K。
(2)每次安全通道被初始化時,就會更新金鑰K。
會話金鑰:每次會話所用的金鑰K稱為會話金鑰。(每次建立安全通道時都需要重新建立一個合適的唯一金鑰K)
三、訊息或位元組流
幾乎所有的系統在密碼層都使用離散訊息系統。
底層傳輸系統是不可靠:
假設實現Alice和Bob之間傳遞訊息的底層傳輸系統是不可靠的。(TCP是可靠的,但從密碼學的角度看,它不能抵禦主動攻擊。從攻擊對手的角度來看,根本沒有可靠的通訊協議)
四、安全性質
(1)除了訊息的長度和傳送時間外,Eve無法得到有關訊息的任何其他資訊。
(2)即使Eve通過操縱正在傳輸的資料對通道進行攻擊,Bob接收到的訊息序列必須是序列的子序列。並且Bob很清楚地獲悉他收到的是哪一個子序列(子序列就是從原序列中去掉0個或更多的元素後得到的序列)。
五、認證與加密的順序
三種順序:
(1)先加密,然後再對密文進行認證(加密然後認證);
優勢:理論結果表明,根據安全加密和認證的某些特定定義,先加密的方案是安全的,而其他方法是不安全的;可以更有效地丟棄偽造訊息。
(2)先認證,然後再對訊息和MAC值進行加密(認證然後加密);
優勢:在大多數情況下,相比看到通訊內容所造成的損害,修改通訊資料是災難性的攻擊;Horton原則,即要對訊息的含義進行認證,而對密文進行認證破壞了這個原則,從而就產生了缺陷。不是對訊息本身進行認證。
(3)同時加密訊息和認證資料,然後將兩個結果組合(如連線)起來(加密同時認證)。
優勢:並行地進行,在某些情況下該方法可以提高效能。
六、安全通道設計概述
1.訊息編號
訊息編號可用於為加密演算法提供需要的IV;無須儲存大量資料即可讓Bob拒絕重放的訊息;Bob可用來判斷在通訊過程中丟失了哪些訊息;保證Bob以正確的順序接收訊息。為此,訊息編號必須單調增加(後面的訊息必須有較大的訊息編號)而且是唯一的(沒有兩個訊息的編號是相同的)。
我們的安全通道設計中採用32位長度的訊息編號,第一個訊息的編號為1。訊息編號必須是唯一的,所以不允許將它重置為0。
2.認證
一個MAC作為認證函式。用HMAC-SHA-256,使用它全部256位輸出。
MAC值a可以計算如下:
3.加密
安全通道設計的加密演算法使用CTR模式下的AES演算法。
採用訊息編碼作為CTR模式需要的唯一瞬時值,仍然不會將生成瞬時值的生成交外部系統,建議不要直接使用CTR模式。
金鑰流由![img](file:///C:\Users\LHP\AppData\Local\Temp\ksohtml\wpsEED1.tmp.jpg)組成,對瞬時值為i的訊息,金鑰流定義為:
4.組織格式
傳送的訊息將由編碼為32位整數的i(其中最低有效位元組在前)與加密後的和
組成。
七、詳細設計
雙向通道:將通道定義為雙向的。
1.初始化:
(1)兩個主函式:建立金鑰和建立訊息編號。
(2)通道金鑰匯出4個附屬金鑰:Alice 給Bob 傳送訊息所用的加密金鑰和認證金鑰,Bob給Alice傳送訊息所用的加密金鑰和認證金鑰。
2.傳送訊息
以會話狀態、要傳送的訊息以及用於認證的附加資料為輸入,輸出準備傳送的已加密和認證的訊息。接收者必須擁有相同的附加資料以進行認證檢查。
由於MsgCntSend被修改了,因此會話狀態要更新。需要再次強調的是:這是至關重要的,因為訊息編號必須唯一。
3.接收訊息
概述接收訊息演算法的輸入有 SendMessage演算法計算出來的經加密和認證後的訊息,以及用於認證的附加資料x。
在認證碼被驗證之前,ReceiveMessage 函式不能洩露關於金鑰流和明文訊息的任何資訊。
危險在於攻擊者可以傳送一個偽造的訊息(帶有不正確的MAC值),但他可以從接收者釋出出來的資料中得到金鑰流。
八、訊息的順序
接收者要確保接收的訊息編號嚴格地遞增,這可以保證任何一個訊息都不會被接收兩次,但如果訊息流在傳輸時改變了順序,一些有效的訊息將會丟失。
九、備選方案
1.OCB模式
最知名、最早的組合模式為OCB模式。這個模式的效率非常高,每一個明文分組都並行地進行處理,這對高速硬體是非常有吸引力的。但是由於一些專利的存在限制了OCB模式的應用。
2.CCM模式
將CTR模式加密和CBC-MAC認證結合起來的方案,通過仔細設計使得在CTR模式和CBC-MAC中使用相同金鑰。與OCB相比,CCM需要兩倍的計算量去加密和認證一個訊息。
3.CWC模式
CWC基於CTR模式來提供加密功能,在底層採用全域雜湊函式來實現認證。CWC模式對全域雜湊函式的使用使得CWC可以完全並行化,但是不存在專利問題。
4.GMAC
GMAC訊息認證方案實際上就是GCM模式中輸入訊息為空串時的情形。
使用:建議只是在128位長度的認證標籤的情況下使用GCM;在OCB、CCM、CWC、GCM以及其他一些類似模式本身無法實現完全的安全通道,它們只提供了加密/認證功能,並且每個包需要一個金鑰和唯一的瞬時值。
問題:如果攻擊者只是去破壞或干擾通道中傳遞的訊號(比如說在傳遞的資訊中插入隨機片段)而不在意通道中傳輸的具體內容,那麼這種攻擊手段還能避免嗎?
第八章 實現上的問題I
實現加密系統最大問題:木桶原理的最脆弱環節。
一、規範
(1)需求規範:需求規範是關於程式應當完成的功能的非正式描述。
(2)功能規範:功能規範對程式的行為進行詳盡的細節定義。
(3)實現設計:這個檔案有很多命名,它指定了程式內部的工作方式,包括了所有無法從。
二、測試和修復
測試只能表現出錯誤的存在,但是不能夠證明錯誤是不存在的。
如果發現一個程式中的錯誤,首先實現一個檢測這個錯誤的測試,並驗證它能夠檢測出這個錯誤。然後修正這個錯誤,並確保測試程式不能再檢測到這個錯誤。最後,繼續在每一個後續版本上執行這個測試程式,以確保這個錯誤不再出現。
一旦發現了一個錯誤,找出引發這個錯誤的原因,同時全面檢查程式,看在程式的其他地方是否還有類似的錯誤。
對發現的每一個錯誤進行跟蹤。對錯誤進行簡單的統計分析可以顯示程式的哪一部分容易有錯誤,或哪一類錯誤會經常發生等等,這種反饋對一個質量控制系統來說是必要的。
三、不嚴謹的態度
人們對程式中的錯誤有著不可置信的不嚴謹的態度。
四、如何著手
千萬不要以為你只需要一個好的程式設計師或很多次程式碼審查工作,或是經過ISO9001認證的開發過程,或者是完全的測試,甚至是以上描述的這些加起來,就足夠了。
編寫正確的程式的成本長期來看是划算的。
五、製作安全的軟體
要求:缺失某些功能。也就是攻擊者無論採取什麼措施,它都不可能做X。
結論:*標準的實現技術完全不適合於編寫安全的程式碼。*
六、保守祕密
兩類祕密資訊:金鑰和資料。這兩類祕密資訊都是瞬時的,不需要長期儲存。資料只有在處理每個訊息的時候儲存,而金鑰也僅僅在安全通道的持續期間儲存。
七、清除狀態
編寫安全軟體的基本規則:立即將不再使用的資料清除。資料儲存的時間越長,其他人獲取資料的機會就越大。
C++:每一個物件都有一個解構函式,這個解構函式可以清除狀態。
C語言:通過呼叫memset 函式完成清除狀態。
JAVA:至少保證finalization函式可以在程式退出時執行。
在C++語言中,至少在理論上可以編寫一個在不再使用時清除所有狀態的程式,但它的很多其他特性使得它並不適用於編寫安全軟體。Java使得清除狀態變得很困難。
八、檔案交換
虛擬記憶體系統可以從我們的程式所佔用的記憶體空間中獲取一些資料,並寫入磁碟上的交換檔案,而我們的程式卻沒有被告知或者注意到。
一旦計算機崩潰或者關機,這些資料仍然儲存在磁碟上。問題在於並沒有清除交換檔案的機制,因此這些資料就會永遠地存留在磁碟上。
解決:以使用系統呼叫,通知虛擬記憶體系統使指定的部分記憶體不被交換出去;鎖定佔用的所有記憶體。
九、高速緩衝儲存器
現代計算機不是僅有一類記憶體,而是使用了有層次結構的記憶體。
高速緩衝儲存器儲存了一些資料的副本,其中包括祕密資料的副本,這對安全性來說很重要。問題是當我們試圖清除祕密資料時,清除操作可能不會正常地發生。
在某些環境下,高速緩衝儲存器知道特定的記憶體單元已經被修改,可能是被多CPU系統中其他CPU修改的。
十、記憶體保留資料
在記憶體裡可以簡單地重寫資料並不能刪除資料。
如果相同的資料存入SRAM(靜態RAM)記憶體的同一單元一段時間,那麼該資料將變成這個記憶體單元所優先的通電狀態。由於DRAM的電容放電的方式,這些儲存的資料可能在電源斷電後仍然存在一段時間,甚至是在記憶體冷卻後還存在。
*冷啟動攻擊*:可以在重新啟動計算機後將記憶體中的金鑰恢復。
*解決方案*:Boojum:設m是我們要儲存的資料,代替原來的直接儲存資料m,我們生成一個隨機數R,然後儲存R和。h是一個雜湊函式。這兩個值被儲存在記憶體的不同單元,最好不要靠得太近。其中的訣竅是以一定的時間間隔有規律地改變R,例如1秒,我們生成新的隨機數,並將儲存的資料更新為和
。這樣可以保證寫入記憶體裡的每一位都是隨機的位序列。若要清除記憶體,只需用0替換m寫入即可。
*侷限性*:這種方法並不能保證記憶體被清除。
十一、其他程式的訪問
計算機裡的其他程式也可能會訪問這些資料。一個危險來自於有特權的使用者,稱為超級使用者或管理員。
十二、資料完整性
計算機裡的其他程式也可能會訪問這些資料。一個危險來自於有特權的使用者,稱為超級使用者或管理員。
十三、需要做的工作
建立包括密碼函式的程式庫非常困難。保護祕密資料的安全要涉及對主程式的修改。
十四、程式碼質量
簡潔性:複雜性是安全性的一大敵人,因此,任何安全性設計都要力爭做到簡潔。
模組化:模組化就是將系統分成一些模組,然後分別設計、分析、實現每一個模組。
模組的介面應儘量簡單易懂,它的行為應該和使用者合理的預期一致。
模組化是我們處理複雜系統的唯一有效的方法,因此它很重要。
斷言:斷言是改善程式碼質量的有用工具。
每個模組都不能信任其他模組,並且始終檢測引數的有效性,強迫限制呼叫順序,並且拒絕執行不安全的操作。
任何時候,在可以對系統內部的一致性進行檢查時,就應該增加一項斷言。捕捉儘可能多的可以捕捉到的錯誤,不論是你自己的還是其他程式設計師的。由斷言發現的錯誤不會導致安全漏洞。
緩衝區溢位:不要使用C或C++。不論使用哪種語言,不要關閉對陣列邊界的檢查。
測試:廣泛的測試總是好的開發過程的一部分,測試可以幫助我們發現程式中的隱含錯誤,但對發現安全漏洞卻沒什麼作用。
兩類測試:第一類是由模組功能規範產生的一組通用測試集。第二類測試集是由模組程式設計師自己開發出來的測試程式,用來測試對程式實現的限制。
十五、測通道攻擊
當攻擊者有另外一個關於這個系統的資訊通道時,就會發生這類攻擊。
重要的側通道攻擊:時間攻擊和RF輻射攻擊。