Posted on 2009-12-03 17:55
深夜兩點 閱讀(788)
評論(0) 編輯 收藏
大學時候學網絡安全,不知道是老師太脫離實際,還是當時我上課睡太多了,反正學了個糊里糊涂。上機實驗比著葫蘆畫瓢在JBoss上搞了個EJBCA的什么東西,就覺得已經混過去了。不過該學的還是得學,躲不過。現在開始還大學睡覺的債。。。。前段時間看了一陣子的Java安全編程,回過頭來總結總結。
首先是跟Java沒關系的,是加密和認證。加密的算法可以分為三類:
- 摘要算法(指紋算法,哈希算法等):摘要算法其實不算加密。算法以數據為輸入,生成一串等長的輸出。這個輸出就是這段輸入的指紋,或者說是摘要。算法不管輸入有多長,1G或者一個byte,輸出都是一樣長的。指紋算法比較形象。我們可以認為,只要數據不同,生成的摘要就是不同的(或者說,想根據一個摘要來生成特定的數據是很難的,所以這個摘要可以唯一的確定數據的身份)。當然是無法從這個簡短的摘要還原原始數據的。比較常用的摘要算法有MD5,SHA-1,DSA之類的。摘要算法是公開的,任何人都可以通過摘要算法來計算一段數據的摘要。所以,如果一個文件傳輸給你,同時也給你一個這個文件的MD5摘要,那么你收到文件后,計算一下文件的MD5,然后和別人給你的MD5摘要比較一下,就知道文件在到你手上之前是不是被人改動過了。
- 對稱加密算法:對稱加密算法是使用相同密鑰加密和解密數據的一種加密算法。密鑰可以認為就是一段數據。使用相同的密鑰這點很重要。對稱加密算法很多,加密解密也很快。最入門的對稱加密算法就使凱撒密碼。工業中使用的加密算法很多,比如用于流加密的RC4,還有AES,DES等。只有有密鑰,那么就可以對加密后的數據進行解密,得到原始的數據。從這里可以看出,密鑰是對稱加密的關鍵,如果密鑰的傳輸無法保證安全,對稱加密就是形同虛設的。
- 非對稱加密算法:非對稱加密算法是計算機加密和認證中最關鍵的一環。非對稱加密的特點是,它有倆密鑰,用密鑰1加密的數據需要使用密鑰2解密,同樣,用密鑰2加密的數據需要用密鑰1解密。如果公開密鑰1,那么密鑰1就成為公鑰,即公開的密鑰,同時,密鑰2就使私鑰,必須好好保存不能讓別人得到。非對稱加密算法有數學證明來保證它幾乎不可能在一個有意義的時間段內被破解。但是非對稱加密也有致命的弱點——加密解密計算量大,不適合用來處理大量的數據。非對稱加密算法有RSA,DSA等。
計算機加密體系需要保證——保密性、完整性、認證性和不可抵賴性。保密性就是說,數據是使用加密算法加密過的(一般是使用對稱加密算法加密)。完整性可以用摘要算法保證,因為一段數據一旦被人改動過了,那么摘要就肯定不同了。但是,這兩者如果沒有非對稱加密算法保護,一切就都是空談。因為,密鑰總歸要通過 internet傳輸的,如果被人竊取了咋辦?摘要?大不了黑客篡改了數據之后,生成一個新的摘要。好,非對稱加密上場了,認證性和不可抵賴性這兩點也是非對稱加密來保證的。它如何來保證前面這些呢?
先看看什么是證書。有了這些算法之后,就有了證書這個概念。啥叫做證書呢?證書其實就是一個文件。文件內容挺多,需要關心的有:
- 非對稱加密的公鑰。它可以用來解密那個秘密的私鑰加密過的數據。
- 用別的私鑰加密過的非對稱加密的公鑰的簽名。上面說的非對稱加密的公鑰也是一段數據呀,用摘要算法計算一下它的摘要。然后用別的私鑰加密一下這個摘要。注意,這里說的是用別的私鑰加密。
- 所謂的別的私鑰的標識。有了這個標識,才知道是誰加密了公鑰的簽名。
問題越來越多了。什么叫做別的私鑰?哪兒來的私鑰?對于一個有效的證書來說,這里說的別的私鑰,就是那些專門來提供證書加密服務的公司(比如 VeriSign)的私鑰。這些公司會全副武裝的保護好自己的私鑰(公司的命根子呀)。下面來敘述一下這個過程:
- 首先,A公司想要一個證書,用來在internet上證明自己確確實實是A公司。于是公司通過工具生成了一對密鑰(這個很簡單,誰都可以輕松的生成一對密鑰)。
- 然后他拿著公鑰去找VeriSign,計算了公鑰的MD5值,請求VeriSign拿出自己的寶貝私鑰,來對這個公鑰的MD5值進行加密。
- VeriSign很專業,他們會要求A公司出具相應的證明,核實無誤后,VeriSign此才會拿出私鑰,把A公司公鑰的MD5值進行加密。這個就叫做簽發證書。
- 這不是一錘子買賣,A公司為了這個事兒,須要按年給VeriSign付錢。
- 好,A公司的公鑰的MD5值被VeriSign的私鑰加密過了,得到了一段加密后的數據,只有VeriSign的公鑰才能解密這段數據,得出正確的值。
- A公司屁顛屁顛的可以生成自己的證書了,證書的內容包括:
- A公司的公鑰。
- VeriSign的私鑰對A公司的公鑰的MD5值加密后,所得到的數據。再次提醒一下,這個密鑰只有VeriSign的公鑰才能解密。
- 一段文字,說明證書是VeriSign驗證的,公鑰的指紋算法是MD5。這段文字不用加密,誰愛看誰看。
終于A公司有了自己的證書,但是,VeriSign的私鑰加密過的東西,須要使用VeriSign的公鑰來解密,咋辦?不用急,VeriSign這種提供證書服務的公司早就和各種操作系統提供商協商好了,他們的公鑰早就一經包含在了每一個操作系統中,在我們安裝操作系統的時候,VeriSign這些公司的公鑰就已經包含在計算機里了。
下面以https來解釋一下計算機中的安全體系(保密性、完整性、認證性和不可抵賴性)是如何工作的。
A公司有了一個站點,瀏覽器使用https來訪問這個站點的時候,大概的過程就是這樣的(下面的過程基本是Https協議的運作過程):
- A公司站點首先給客戶端發送自己的寶貝證書。(數據傳輸的時候被人從中間截獲了?不怕,想聽就聽吧)
- 認證性:客戶端得到證書之后,開始驗證這個證書:
- 首先,客戶端從證書中知道,這個證書是被VeriSign公司簽發的。所以客戶端從操作系統中拿出來VeriSign公司的公鑰,待用。
- 客戶端還知道,A公司公鑰是使用MD5算法計算的簽名,OK,客戶端讀取出來證書中A公司的公鑰,使用MD5值,待用。
- 下面是重要的一步了,客戶端從A公司的證書中抽取出那段加密后的數據(也就是A公司公鑰的MD5值被VeriSign公司的私鑰加密過的那段數據),然后再拿過來第一步中找到的VeriSign公司的公鑰,非對稱加密的特點就是私鑰加密,公鑰解密之。所以,當當當當當,解密之,得到的值就應該是A公司的公鑰的MD5值。< /li>
- 那到底是不是呢?跟第二步中客戶端自己計算出來的MD5值比對一下就知道了。
- 如果通過比較,發現確實是,那么安全體系中的認證性就得到保證了,也就是說,客戶端可以完全相信對方就是A公司,訪問的站點也就是A公司的站點。(等等,A公司的公鑰不是公開的嗎?那豈不是任何站點都可以偽裝成A公司?不急,這不是個事兒,在下面不可抵賴性會說到)當然,如果驗證不通過,說明對方是個“李鬼”。瀏覽器會有提示,說這個站點提供的證書沒有通過驗證思密達(還有一種情況就是,證書過期了,還記得前面說的每年給VeriSign的年費嗎)。
- 好,客戶端驗證通過了,下面就是開始傳輸數據了。傳輸數據的過程有保密性、完整性和不可抵賴性三點需要保證。
- 首先,客戶端瀏覽器悄悄地生成一個隨機數。然后使用A公司的公鑰加密這個隨機數,發送給A公司的站點。因為是A公司公鑰加密的,所以不怕被人竊聽。為啥不怕被竊聽,因為竊聽了也沒用,因為竊聽者肯定沒有A公司的私鑰,沒有私鑰也就沒法對竊聽到的數據解密。
- A公司站點收到這個數據后,開始使用自己的私鑰解密數據。到了這個時候,肯定是只有客戶端和A公司的站點服務器知道這個隨機數的。
- 接下來,客戶端瀏覽器和A公司站點根據相同的算法,生成對稱加密使用的密鑰(實際上是一組密鑰,當然在這里不用深究這個)。以后的數據傳輸就全使用這個對稱加密密鑰進行了。這就是保密性。
- 保密性得到了保證,完整性如何保證呢?如果攻擊者雖然不能夠獲得數據,但是他想搗蛋,偷偷篡改數據來破壞數據的完整性。這個時候也沒啥問題,在https 協議中,每條消息在加密之前都包含了消息內容和消息的hash值(比如,消息的MD5值),這樣在消息的接收端,就可以對這條消息進行驗證了。通過驗證就可以知道消息是不是被篡改過。當然,如果被篡改過,也使沒辦法回復的,不過知道消息被篡改過,那么就可以要求對方重新發送消息了,總之攻擊者是沒法辦得逞的。這就是消息的完整性。
- 好的,在這里我們來看一下不可抵賴性。因為只有A公司有私鑰,這也就是說,只有A公司可以把這個數據成功解密,來得到這個隨機數,從而來計算對稱加密使用的密鑰。所以,如果A公司想抵賴說那個站點不是自己,是不可能的事情。因為只有A公司有這個用于解密的私鑰,不是A公司是誰。同樣,就好像在前面說的,如果有人用A公司的公鑰冒充A公司,那么這個李鬼其實沒有A公司的公鑰,也就沒有辦法解密數據(注意,客戶端產生的隨機數是使用A公司的公鑰加密的,須要使用A公司的私鑰解密),所以這個是徒勞的。
好,保密性、完整性、認證性和不可抵賴性都在上面的過程中都得到保證了。這個過程的核心就是非對稱加密的特性:公鑰加密私鑰解密,私鑰加密公鑰解密。本篇到此結束,下一篇中將涉及Java中的認證和加密。
關于https的具體內容可以參考這篇文章:http://www.infoq.com/cn/articles/HTTPS-Connection-Jeff-Moser