計算機網路-7-5-金鑰分配
金鑰分配
由於密碼演算法是公開的,網路的安全性就完全基於金鑰的安全保護上。因此在密碼學中出現了一個重要的分支金鑰管理。金鑰管理包括:金鑰的產生、分配、注入、驗證和使用。本節只討論金鑰的分配。
金鑰分配(或金鑰分發)是金鑰管理中最大的問題。金鑰必須通過最安全的通路進行分配。例如,可以派非常可靠的信使攜帶金鑰分配給互相通訊的各使用者。這種方法稱為網外分配方式。但隨著使用者的增多和網路流量的增大,金鑰更換頻繁(金鑰必須定期更換才能做到可靠),派信使的辦法已不再適用,而應採用網內分配方式,即對金鑰自動分配。
對稱金鑰的分配
對稱金鑰存分配存在以下兩個問題:
- 如果n個人中的每一個需要和其他n-1個人通訊,就需要 n(n-1)個金鑰。但每兩人共享一個金鑰,因此金鑰數是n(n - 1)/2。這常稱為\(n^2\)
- 通訊的雙方怎麼才能安全的共享到金鑰呢?正是因為網路的不安全,所以才需要使用加密技術。但金鑰又需要怎樣傳輸呢?
目前常用的是金鑰分配方式是設立金鑰分配中心KDC(Key Distribution Center)。KDC是大家都信任的機構,其任務就是給需要進行祕密通訊的使用者臨時分配一個會話金鑰(僅使用一次)。在圖7-10中假定使用者A和使用者B都是KDC的登記使用者。A和B在KDC登記時就已經在KDC伺服器上安裝了各自和KDC進行通訊的主金鑰(master key)\(K_A\)和\(K_B\)。為了簡單起見,下面在敘述時把主金鑰簡稱為金鑰。金鑰分配為3個步驟(如圖7-11):
- 使用者A向金鑰分配中心KDC傳送時用明文,說明想和使用者B通訊。在明文中給出A和B在KDC登記的身份。
- KDC用隨機數產生“一次一密”的會話金鑰\(K_{AB}\)供A和B的這次會話使用,然後向A傳送回答報文。這個回答報文用A的金鑰\(K_A\)加密。這個報文中包含這次會話使用的金鑰\(K_{AB}\)和請A轉給B的一個票據(ticket)<該票據包括A和B在KDC登記的身份,以及這次會話將要使用的金鑰\(K_{AB}\)。票據用B的金鑰\(K_B\)加密,A無法知道此票據的內容,因為A沒有B的金鑰\(K_B\),當然A也不需要知道此票據的內容。
- 當B收到A轉來的票據並使用自己的金鑰\(K_B\)
此後,A和B就可以使用會話金鑰\(K_{AB}\)進行這次通訊了。
請注意,在網路上傳送金鑰時,都是經過加密的。解密用的金鑰都不在網路上傳送。
KDC還可在報文中加入時間戳,以防止報文的擷取者利用以前已記錄下的報文進行重放攻擊。會話金鑰\(K_{AB}\)是一次性的,因此保密性較高。而KDC分配給使用者的金鑰\(K_A\)和\(K_B\),都應定期更換,以減少攻擊者破譯金鑰的機會。
目前最出名的金鑰分配協議是Kerberos V5° [RFC 4120,4121,目前是建議標準],是美國麻省理工學院(MIT)開發的。Kerberos既是鑑別協議,同時也是KDC,它已經變得很普及,現在是網際網路建議標準。Kerberos 使用比 DES 更加安全的高階加密標準 AES 進行加密。下面用圖 7-12 介紹 Kerberos V4 的大致工作過程(其原理和V5大體一樣,但稍簡單些)。
- A用明文(包括登記的身份)向鑑別伺服器AS表明自己的身份。AS就是KDC,它掌握各實體登記的身份和相應的口令。AS對A的身份進行驗證。只有驗證結果正確,才允許A和票據授予伺服器TGS進行聯絡。
- 鑑別伺服器AS向A傳送用A的對稱金鑰\(K_A\)加密的報文,這個報文包含A和TGS通訊的會話金鑰\(K_S\)以及AS要傳送給TGS的票據(這個票據是用TGS的對稱金鑰\(K_{TG}\)加密的)。A並不儲存金鑰\(K_A\),但當這個報文到達A時,A就鍵入其口令。若口令正確,則該口令和適當的演算法一起就能生成金鑰\(K_A\)。這個口令隨即被銷燬。金鑰\(K_A\)用來對AS傳送過來的報文進行解密。這樣就提取出會話金鑰\(K_S\)(這是A和TGS通訊要使用的)以及要轉發給TGS的票據(這是用金鑰\(K_{TG}\)加密的)。
- A向TGS傳送三項內容:
- 轉發鑑別伺服器AS發來的票據。
- 伺服器B的名字,這表明A請求B的服務,請注意,現在A向TGS證明自己的身份並非通過鍵入口令(因為入侵者很容易的從網路上截獲明文口令),而是通過轉發AS發出的票據(只有A才能提取出)。票據是加密的,入侵者偽造不了。
- 用\(K_S\)加密的時間戳T。它用來防止入侵者的重放攻擊。
- TGS傳送兩個票據,每一個都包含A和B通訊的會話金鑰\(K_{AB}\)。給A的票據用\(K_S\)加密;給B的票據用B的金鑰\(K_B\)加密。請注意,現在入侵者不能提取 \(K_{AB}\),因為不知道\(K_S\)和\(K_B\)。入侵者也不能重放步驟3,因為入侵者不能把時間戳更換為一個新的(因為不知道\(K_S\))。如果入侵者在時間戳到期之前,非常迅速地傳送步驟3的報文,那麼對 GS傳送過來的兩個票據仍然不能解密。
- A向B轉發TGS發來的票據,同時傳送用\(K_{AB}\)加密的時間戳T。
- B把時間戳+1來證實TGS給出的會話金鑰\(K_{AB}\)進行通訊。
順便指出,Kerberos 要求所有使用 Kerberos 的主機必須在時鐘上進行“鬆散的”同步。所謂“鬆散的”同步是要求所有主機的時鐘誤差不能太大,例如,不能超過5分鐘的數量級。這個要求是為了防止重放攻擊。TGS 發出的票據都設定較短的有效期。超過有效期的票據就作廢了。因此入侵者即使截獲了某個票據,也不能長期保留用來進行以後的重放攻擊。
公鑰的分配
在公鑰密碼體制中,如果每個使用者都具有其他使用者的公鑰,就可實現安全通訊。看起來好像可以隨意公佈使用者的公鑰,其實不然。設想使用者A要欺騙使用者B,A可以向B傳送一份偽造是C傳送的報文,A用自己的私鑰進行數字簽名,並附上A自己的公鑰,謊稱這公鑰是C 的。B如何知道這個公鑰不是C的呢?顯然,這需要有一個值得信賴的機構來將公鑰與其對應的實體(人或機器)進行繫結(binding)。這樣的機構就叫做認證中心 CA(Certification Authority),它一般由政府出資建立。每個實體都有 CA 發來的證書
(certificate),裡面有公鑰及其擁有者的標識資訊(人名或IP地址)。此證書被CA進行了數字簽名。任何使用者都可以從可信的地方獲得認證中心CA的公鑰,此公鑰用來驗證某個公鑰是否為某個實體所擁有(通過向CA進行查詢)。