3.7.4 可行的密鑰管理
我們可以使用類似于Kerberos的協(xié)議來建立與管理用戶之間實際工作的密鑰,這要求每個用戶與充當(dāng)密鑰分發(fā)中心的服務(wù)器之間共享一個或多個長期密鑰。本書后面將描述大量其他類似協(xié)議,比如第10章將討論銀行如何與其每臺ATM以及與其連接的每個銀行內(nèi)網(wǎng)絡(luò)建立長期共享密鑰,之后,銀行會使用與Kerberos不太相同的協(xié)議與其每臺ATM以及網(wǎng)絡(luò)交換機建立一個日密鑰,因此,當(dāng)你在屬于其他銀行的ATM上進(jìn)行操作并試圖通過Cirrus網(wǎng)絡(luò)取錢時,ATM將使用其與所屬銀行共享的工作密鑰對交易數(shù)據(jù)進(jìn)行加密,之后,銀行將使用該網(wǎng)絡(luò)的日密鑰進(jìn)行加密的交易數(shù)據(jù)傳遞給Cirrus網(wǎng)絡(luò)。
到現(xiàn)在似乎一切都不錯,但只要稍稍考慮一下就會發(fā)現(xiàn),如果按上面的方式實現(xiàn),銀行就必須為其所擁有的數(shù)百臺ATM取款機分別維護(hù)不同的密鑰——?一個長期的主密鑰,可能還需要一個加密密鑰與一個身份驗證密鑰,銀行網(wǎng)絡(luò)的每個子網(wǎng)絡(luò)都需要一些密鑰。數(shù)百萬電子銀行客戶使用的密碼與安全信息,如果這些客戶所在計算機上安裝了使用密碼學(xué)機制的客戶端,也需要為其提供相應(yīng)密鑰。此外,還需要為數(shù)千個員工提供加密的密碼,形式上也可能是使用用戶密碼加密的Kerberos密鑰。面對如此之多的密鑰原料,如何進(jìn)行管理?
密鑰管理是一個復(fù)雜而困難的問題,并且經(jīng)常出錯,因為這通常不是要考慮的首要問題。一個負(fù)責(zé)任的工程師會認(rèn)真思考需要多少個密鑰、如何生成這些密鑰、密鑰需要存活多久以及最終如何銷毀密鑰。還有更多需要考慮的問題,F(xiàn)ederal Information Processing Standard for key management[948]中列出了大多數(shù)這類問題。此外,由于應(yīng)用程序的不斷演化,會導(dǎo)致出現(xiàn)新的問題,所以提供額外密鑰以支持未來的功能是重要的,這樣就不會因為在不兼容的協(xié)議中重用而導(dǎo)致現(xiàn)有功能損壞。為從安全失敗中恢復(fù)提供必要支持也是重要的。然而,這些都沒有標(biāo)準(zhǔn)的做法。
有很多實際可行的策略,但沒有哪一種是直截了當(dāng)?shù)?。公鑰加密(將在第5章進(jìn)行討論)可以在一定程度上簡化密鑰管理的工作,長期密鑰可以分為私鑰與公鑰兩個部分,你不需要保存公鑰部分,但必須保證其完整性。在銀行系統(tǒng)中,通常的做法是使用稱為安全模塊的專用密碼處理器,第16章將對其進(jìn)行詳細(xì)描述。這些設(shè)備完成所有密碼學(xué)處理,并包含一些用于保護(hù)應(yīng)用程序密鑰的內(nèi)部密鑰。由此,你可以讓安全模塊為每個ATM生成主密鑰,并將其加密后的值存放在ATM主文件中。當(dāng)有來自某個ATM的交易數(shù)據(jù)時,就可以從該文件中取回加密后的密鑰,并將加密數(shù)據(jù)與其一起傳送給安全模塊,之后由安全模塊進(jìn)行必要的處理:對PIN進(jìn)行解密,并對其進(jìn)行驗證——或許通過與本地保存的加密值進(jìn)行比較來實現(xiàn)。遺憾的是,用于完成這些操作的協(xié)議經(jīng)常會失敗。有很多種攻擊方法可以滲透安全模塊的應(yīng)用程序接口(API),而協(xié)議在API中是暴露的。第18章將詳細(xì)描述這些攻擊方法。現(xiàn)在只要知道讓安全協(xié)議正確運行并不容易就足夠了。你不能在家中設(shè)計協(xié)議,這比設(shè)計爆炸裝置可要復(fù)雜得多。