第三章、 在 MANET 上以 SIP 為基礎的安全群播協定
3.2 金鑰交換
3.2.2 在 MANET 上 SIP 的金鑰交換協定
一個節點要建立一個新的ALM群體時,首先會送出INVITE訊息,在3.2.1中 討論到,如果這個訊息經過竄改,那之後所要加入這個ALM群體的成員,可能 會遭受竊聽或者是中介者攻擊(MAN IN MIDDLE ATTACK),因此首先要保證這 個INVITE訊息的完整性,而當ALM群體建立完成之後,如果兩個群體成員進行 這個ALM群體提供的服務做通訊,例如在一個<IM>的群體,就是進行Instant Message服務,會使用MESSAGERequest(RFC 3428) [5]訊息來做通訊,但是因為 在SIP中Request MESSAGE的是明文,所以,在MANET上所有轉送的節點,都 可以簡單就竊聽到兩方通訊的訊息,因此,在MANET上,兩點通訊的私密性更 是顯得額外重要,因此本研究提出使用橢圓曲線的Diffie-Hellamn金鑰交換法來 做訊息加密,在MANET環境裡,使用金鑰長度短與運算量小的加解密法是很重 要的,因此使用橢圓曲線來做加解密。
因此,在本研究的應用層的網狀網路建立之後,每一個節點皆有其他節點的 Public key,可以用來用驗證訊息的完整性,同時也可以驗證訊息是否為發起的 節點傳送,因為數位簽章具有不可否認性,當一個節點發起一個ALM群體之後,
會傳輸一個INVITE訊息給其他在這個應用層網狀網路的成員,之後這個節點會 等待一段時間收集回傳的OK訊息,每一個成員在接收到這個訊息之後,如果想 要去加入這個新建立的ALM群體,就使用發起節點的Public key去驗證這個訊 息,如果沒有遭受竄改以及確實由這個ALM群體領導者所發起,便回傳OK訊息 回去,並且加上簽章,如果驗證有錯就遺棄這個訊息,發起的ALM群體的節點 在收到OK訊息之後,就依據這個請求加入的節點,使用這個節點的Public key去 做驗證是否經過驗證,以及是否確實為要求加入節點所發起的訊息,如果無誤就 接受這個節點,在等待時間結束之後,這個發起ALM群體的領導者便傳送 NOTIFY_k給所有參予者個ALM群體的節點,這個訊息裡面包含了這個ALM群 體所產生的橢圓曲線的參數,將橢圓曲線的參數包括p、a、b、G放入<ECC>(在 本研究中為一個ECCParameterSpec的Object),然後加上簽章傳送給加入這個 ALM群體的節點,之後收到的ALM成員在確定橢圓曲線參數沒有被竄改之後,
就傳送OK訊息回去裡面包含節點本身計算出來的Public key在<Public
key>HEADER裡面,加上簽章回傳給ALM的領導者,之後ALM領導者收到所有 人的回傳之後,再傳送一個NOTIFY回去給其他的參予者,裡面會有這個ALM群 體所有的參予者,以及這個些參予者的Public key,之後,如果要傳送訊息,便 可以使用節點本身的Private key與對方節點的Public key一起做加密,對方節點收 到之後,就使用節點本身的Private key加上對方節點的Public key做解密,再加上 簽章,這樣在傳送的期間,可以保護訊息的私密性以及訊息的完整性,在MANET 上傳輸經過節點轉傳時,訊息的內容可以保密,也不怕訊息被竄改。
以在3.2.1中所討論ALM群體建立的流程為例,使用同樣的節點的分布圖(圖 24),本研究所提出之使用金鑰交換的ALM群體建立流程如下:
MN4
MN2 MN7
MN5
Non-SIP node
MN9 MN6
SIP NODE MN8
圖 27、ALM 建立節點分布圖
MN7 MN9 MN4 MN8 MN6
18.NOTIFY_d 12.INVITE with
Join
6.OK Include <Publickey> 7.OK Include MN6's Public key 8.NOTIFY
3.OK
5.NOTIFY_k Include
<ECC>
11.OK
18.NOTIFY_d
4.NOTIFY_k Include <ECC>
9.NOTIFY 10.OK
13.OK
1.INVITE 1.INVITE 2.INVITE
2.INVITE
14.NOTIFY_k Include <ECC>
15.OK Include
<Publickey>
16.NOTIFY 17.OK
3.OK
18.NOTIFY_d
19.OK 19.OK
20.OK
21.MESSAGE Use ECC encryeption
22.MESSAGE Use ECC encryeption
圖 28、架入金鑰節點流程圖
Step 1. MN8決定發起一個ALM群體,傳送INVITE訊息給其他的節點,這個 INVITE的訊息會使用MN8在應用層網狀網路所交換的數位簽章的Private key加上簽章。
Step 2. 因為MN9、MN7為MN4的子節點,所以透過MN4來轉傳MN8的INVITE 訊息。
Step 3,4. 所有收到INVITE訊息的節點,都會使用MN8的Public key做簽章的驗 證,如果有錯誤,就丟棄這個訊息,如果簽章驗證正常,再決定是否加入 這個ALM群體,在本例中MN6與MN9決定加入MN8所成立的ALM群體,
並且回傳OK訊息給MN8,MN6與MN9也在傳遞的OK訊息中加入自己的 簽章,這樣一來可以防止有節點偽造節點要加入的訊息也竊取資料。
Step 5. MN8收到回傳的OK訊息之後,先去驗證是否簽章正確,如果產生問題則 丟棄這個OK訊息,如果簽章正確,即將傳送OK訊息的節點設為ALM群 體的成員,在等待期間結束之後,MN8傳送NOTIFY_k訊息給MN6與 MN9,這個NOTIFY_k訊息為MN8所選定的橢圓曲線參數,用來計算 Diffie_Hellman金鑰交換的每個ALM成員的Public key,此訊息加上簽章,
以防止訊息遭受竄改。
Step 6,7. MN6與MN9驗證完傳送的訊息之後,依據<ECC>的參數,計算出自己 的Public key,加上簽章回傳OK訊息給MN8。
Step 8,9. MN8將加入ALM群體的成員資料,包括各個節點計算的Public key,加 上簽章傳送給ALM群體的成員MN6與MN9。
Step 10,11. MN6與MN9收到NOTIFY訊息之後,先比對簽章,然後再比對自己的 Public key是否正確,沒有錯誤的話,就回傳OK訊息給MN8。
Step 12. MN4決定加入MN8的ALM群體,因此傳送INVITE訊息給MN8其中包含 一個Join的Header,加上簽章傳送給MN8,如此一來可以確保這個加入訊 息沒有被竄改,更重要的是透過簽章,可以確定這個訊息是由MN4所傳 送。
Step 13. MN8驗證無誤之後,接受MN4的加入請求,回傳OK訊息回去給MN4。
Step 14. MN8傳送一個NOTIFY_k訊息給MN4,裡面包含這個ALM群體所用來做 為金鑰交換的橢圓曲線參數<ECC>。
Step 15. MN4收到之後,驗證簽章,之後便使用<ECC>中的參數,計算自己的 Public key,加上簽章回傳給MN8。
Step 16. MN8驗證簽章之後,便加上簽章傳送NOTIFY訊息給MN4,裡面包含目 前ALM群體上的成員以及成員的Public key。
Step 17. MN4收到NOTIFY訊息之後,驗證簽章接著回傳OK訊息給MN8。
Step 18. MN8傳送NOTIFY_d訊息給所有的ALM群體成員,有ALM成員加入,將 新成員的資訊以及新籌員的Public key一起傳送給ALM群體的所有成員。
Step 19,20. 所有的ALM成員驗證簽章之後,就回傳OK訊息給MN8表示已經收到 更新的訊息,MN4也比對自己的公開金鑰是否有錯,如果無誤就回傳OK 訊息回去,如此便完成新節點加入的流程。
Step 21,22. MN4使用MN6的Public key與MN4自己的Private key做加密傳送 Instant Message給MN6,MN6收到之後使用自己的Private key與MN4的 Public key做解密,雙方進行通訊。
而當節點要離開ALM群體以及應用層網狀網路時,網路與ALM群體成員只 需要將這個節點從節點名單與ALM群體名單移除即可,不需要額外的動作就可 以移除離開的成員。
透過本研究所提出的協定,可以在ALM群體加入以及訊息傳遞的過程中,
保障其訊息傳遞的不可否認性,完整性與私密性,提升了SIP系統在MANET上運 作的安全性。