計算機中的加密和認(rèn)證。

          Posted on 2009-12-03 17:55 深夜兩點 閱讀(790) 評論(0)  編輯  收藏
          大學(xué)時候?qū)W網(wǎng)絡(luò)安全,不知道是老師太脫離實際,還是當(dāng)時我上課睡太多了,反正學(xué)了個糊里糊涂。上機實驗比著葫蘆畫瓢在JBoss上搞了個EJBCA的什么東西,就覺得已經(jīng)混過去了。不過該學(xué)的還是得學(xué),躲不過。現(xiàn)在開始還大學(xué)睡覺的債。。。。前段時間看了一陣子的Java安全編程,回過頭來總結(jié)總結(jié)。

          首先是跟Java沒關(guān)系的,是加密和認(rèn)證。加密的算法可以分為三類:
          • 摘要算法(指紋算法,哈希算法等):摘要算法其實不算加密。算法以數(shù)據(jù)為輸入,生成一串等長的輸出。這個輸出就是這段輸入的指紋,或者說是摘要。算法不管輸入有多長,1G或者一個byte,輸出都是一樣長的。指紋算法比較形象。我們可以認(rèn)為,只要數(shù)據(jù)不同,生成的摘要就是不同的(或者說,想根據(jù)一個摘要來生成特定的數(shù)據(jù)是很難的,所以這個摘要可以唯一的確定數(shù)據(jù)的身份)。當(dāng)然是無法從這個簡短的摘要還原原始數(shù)據(jù)的。比較常用的摘要算法有MD5,SHA-1,DSA之類的。摘要算法是公開的,任何人都可以通過摘要算法來計算一段數(shù)據(jù)的摘要。所以,如果一個文件傳輸給你,同時也給你一個這個文件的MD5摘要,那么你收到文件后,計算一下文件的MD5,然后和別人給你的MD5摘要比較一下,就知道文件在到你手上之前是不是被人改動過了。
          • 對稱加密算法:對稱加密算法是使用相同密鑰加密和解密數(shù)據(jù)的一種加密算法。密鑰可以認(rèn)為就是一段數(shù)據(jù)。使用相同的密鑰這點很重要。對稱加密算法很多,加密解密也很快。最入門的對稱加密算法就使凱撒密碼。工業(yè)中使用的加密算法很多,比如用于流加密的RC4,還有AES,DES等。只有有密鑰,那么就可以對加密后的數(shù)據(jù)進(jìn)行解密,得到原始的數(shù)據(jù)。從這里可以看出,密鑰是對稱加密的關(guān)鍵,如果密鑰的傳輸無法保證安全,對稱加密就是形同虛設(shè)的。
          • 非對稱加密算法:非對稱加密算法是計算機加密和認(rèn)證中最關(guān)鍵的一環(huán)。非對稱加密的特點是,它有倆密鑰,用密鑰1加密的數(shù)據(jù)需要使用密鑰2解密,同樣,用密鑰2加密的數(shù)據(jù)需要用密鑰1解密。如果公開密鑰1,那么密鑰1就成為公鑰,即公開的密鑰,同時,密鑰2就使私鑰,必須好好保存不能讓別人得到。非對稱加密算法有數(shù)學(xué)證明來保證它幾乎不可能在一個有意義的時間段內(nèi)被破解。但是非對稱加密也有致命的弱點——加密解密計算量大,不適合用來處理大量的數(shù)據(jù)。非對稱加密算法有RSA,DSA等。
          計算機加密體系需要保證——保密性、完整性、認(rèn)證性和不可抵賴性。保密性就是說,數(shù)據(jù)是使用加密算法加密過的(一般是使用對稱加密算法加密)。完整性可以用摘要算法保證,因為一段數(shù)據(jù)一旦被人改動過了,那么摘要就肯定不同了。但是,這兩者如果沒有非對稱加密算法保護(hù),一切就都是空談。因為,密鑰總歸要通過 internet傳輸?shù)模绻蝗烁`取了咋辦?摘要?大不了黑客篡改了數(shù)據(jù)之后,生成一個新的摘要。好,非對稱加密上場了,認(rèn)證性和不可抵賴性這兩點也是非對稱加密來保證的。它如何來保證前面這些呢?

          先看看什么是證書。有了這些算法之后,就有了證書這個概念。啥叫做證書呢?證書其實就是一個文件。文件內(nèi)容挺多,需要關(guān)心的有:
          • 非對稱加密的公鑰。它可以用來解密那個秘密的私鑰加密過的數(shù)據(jù)。
          • 用別的私鑰加密過的非對稱加密的公鑰的簽名。上面說的非對稱加密的公鑰也是一段數(shù)據(jù)呀,用摘要算法計算一下它的摘要。然后用別的私鑰加密一下這個摘要。注意,這里說的是用別的私鑰加密。
          • 所謂的別的私鑰的標(biāo)識。有了這個標(biāo)識,才知道是誰加密了公鑰的簽名。
          問題越來越多了。什么叫做別的私鑰?哪兒來的私鑰?對于一個有效的證書來說,這里說的別的私鑰,就是那些專門來提供證書加密服務(wù)的公司(比如 VeriSign)的私鑰。這些公司會全副武裝的保護(hù)好自己的私鑰(公司的命根子呀)。下面來敘述一下這個過程:
          1. 首先,A公司想要一個證書,用來在internet上證明自己確確實實是A公司。于是公司通過工具生成了一對密鑰(這個很簡單,誰都可以輕松的生成一對密鑰)。
          2. 然后他拿著公鑰去找VeriSign,計算了公鑰的MD5值,請求VeriSign拿出自己的寶貝私鑰,來對這個公鑰的MD5值進(jìn)行加密。
          3. VeriSign很專業(yè),他們會要求A公司出具相應(yīng)的證明,核實無誤后,VeriSign此才會拿出私鑰,把A公司公鑰的MD5值進(jìn)行加密。這個就叫做簽發(fā)證書。
          4. 這不是一錘子買賣,A公司為了這個事兒,須要按年給VeriSign付錢。
          5. 好,A公司的公鑰的MD5值被VeriSign的私鑰加密過了,得到了一段加密后的數(shù)據(jù),只有VeriSign的公鑰才能解密這段數(shù)據(jù),得出正確的值。
          6. A公司屁顛屁顛的可以生成自己的證書了,證書的內(nèi)容包括:
          • A公司的公鑰。
          • VeriSign的私鑰對A公司的公鑰的MD5值加密后,所得到的數(shù)據(jù)。再次提醒一下,這個密鑰只有VeriSign的公鑰才能解密。
          • 一段文字,說明證書是VeriSign驗證的,公鑰的指紋算法是MD5。這段文字不用加密,誰愛看誰看。
          終于A公司有了自己的證書,但是,VeriSign的私鑰加密過的東西,須要使用VeriSign的公鑰來解密,咋辦?不用急,VeriSign這種提供證書服務(wù)的公司早就和各種操作系統(tǒng)提供商協(xié)商好了,他們的公鑰早就一經(jīng)包含在了每一個操作系統(tǒng)中,在我們安裝操作系統(tǒng)的時候,VeriSign這些公司的公鑰就已經(jīng)包含在計算機里了。

          下面以https來解釋一下計算機中的安全體系(保密性、完整性、認(rèn)證性和不可抵賴性)是如何工作的。
          A公司有了一個站點,瀏覽器使用https來訪問這個站點的時候,大概的過程就是這樣的(下面的過程基本是Https協(xié)議的運作過程):
          1. A公司站點首先給客戶端發(fā)送自己的寶貝證書。(數(shù)據(jù)傳輸?shù)臅r候被人從中間截獲了?不怕,想聽就聽吧)
          2. 認(rèn)證性:客戶端得到證書之后,開始驗證這個證書:
            • 首先,客戶端從證書中知道,這個證書是被VeriSign公司簽發(fā)的。所以客戶端從操作系統(tǒng)中拿出來VeriSign公司的公鑰,待用。
            • 客戶端還知道,A公司公鑰是使用MD5算法計算的簽名,OK,客戶端讀取出來證書中A公司的公鑰,使用MD5值,待用。
            • 下面是重要的一步了,客戶端從A公司的證書中抽取出那段加密后的數(shù)據(jù)(也就是A公司公鑰的MD5值VeriSign公司的私鑰加密過的那段數(shù)據(jù)),然后再拿過來第一步中找到的VeriSign公司的公鑰,非對稱加密的特點就是私鑰加密,公鑰解密之。所以,當(dāng)當(dāng)當(dāng)當(dāng)當(dāng),解密之,得到的值就應(yīng)該是A公司的公鑰的MD5值。< /li>
            • 那到底是不是呢?跟第二步中客戶端自己計算出來的MD5值比對一下就知道了。
            • 如果通過比較,發(fā)現(xiàn)確實是,那么安全體系中的認(rèn)證性就得到保證了,也就是說,客戶端可以完全相信對方就是A公司,訪問的站點也就是A公司的站點。(等等,A公司的公鑰不是公開的嗎?那豈不是任何站點都可以偽裝成A公司?不急,這不是個事兒,在下面不可抵賴性會說到)當(dāng)然,如果驗證不通過,說明對方是個“李鬼”。瀏覽器會有提示,說這個站點提供的證書沒有通過驗證思密達(dá)(還有一種情況就是,證書過期了,還記得前面說的每年給VeriSign的年費嗎)。
          3. 好,客戶端驗證通過了,下面就是開始傳輸數(shù)據(jù)了。傳輸數(shù)據(jù)的過程有保密性、完整性和不可抵賴性三點需要保證。
          4. 首先,客戶端瀏覽器悄悄地生成一個隨機數(shù)。然后使用A公司的公鑰加密這個隨機數(shù),發(fā)送給A公司的站點。因為是A公司公鑰加密的,所以不怕被人竊聽。為啥不怕被竊聽,因為竊聽了也沒用,因為竊聽者肯定沒有A公司的私鑰,沒有私鑰也就沒法對竊聽到的數(shù)據(jù)解密。
          5. A公司站點收到這個數(shù)據(jù)后,開始使用自己的私鑰解密數(shù)據(jù)。到了這個時候,肯定是只有客戶端和A公司的站點服務(wù)器知道這個隨機數(shù)的。
          6. 接下來,客戶端瀏覽器和A公司站點根據(jù)相同的算法,生成對稱加密使用的密鑰(實際上是一組密鑰,當(dāng)然在這里不用深究這個)。以后的數(shù)據(jù)傳輸就全使用這個對稱加密密鑰進(jìn)行了。這就是保密性
          7. 保密性得到了保證,完整性如何保證呢?如果攻擊者雖然不能夠獲得數(shù)據(jù),但是他想搗蛋,偷偷篡改數(shù)據(jù)來破壞數(shù)據(jù)的完整性。這個時候也沒啥問題,在https 協(xié)議中,每條消息在加密之前都包含了消息內(nèi)容和消息的hash值(比如,消息的MD5值),這樣在消息的接收端,就可以對這條消息進(jìn)行驗證了。通過驗證就可以知道消息是不是被篡改過。當(dāng)然,如果被篡改過,也使沒辦法回復(fù)的,不過知道消息被篡改過,那么就可以要求對方重新發(fā)送消息了,總之攻擊者是沒法辦得逞的。這就是消息的完整性
          8. 好的,在這里我們來看一下不可抵賴性。因為只有A公司有私鑰,這也就是說,只有A公司可以把這個數(shù)據(jù)成功解密,來得到這個隨機數(shù),從而來計算對稱加密使用的密鑰。所以,如果A公司想抵賴說那個站點不是自己,是不可能的事情。因為只有A公司有這個用于解密的私鑰,不是A公司是誰。同樣,就好像在前面說的,如果有人用A公司的公鑰冒充A公司,那么這個李鬼其實沒有A公司的公鑰,也就沒有辦法解密數(shù)據(jù)(注意,客戶端產(chǎn)生的隨機數(shù)是使用A公司的公鑰加密的,須要使用A公司的私鑰解密),所以這個是徒勞的。
          好,保密性、完整性、認(rèn)證性和不可抵賴性都在上面的過程中都得到保證了。這個過程的核心就是非對稱加密的特性:公鑰加密私鑰解密,私鑰加密公鑰解密。本篇到此結(jié)束,下一篇中將涉及Java中的認(rèn)證和加密。

          關(guān)于https的具體內(nèi)容可以參考這篇文章:http://www.infoq.com/cn/articles/HTTPS-Connection-Jeff-Moser






          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 石门县| 通榆县| 新邵县| 澄迈县| 闸北区| 花莲市| 利辛县| 楚雄市| 吴旗县| 关岭| 延庆县| 克拉玛依市| 威海市| 玉门市| 盐边县| 贵溪市| 泉州市| 花莲县| 泸水县| 南康市| 米林县| 乐陵市| 桑日县| 海伦市| 若尔盖县| 永泰县| 康乐县| 黄骅市| 什邡市| 保山市| 丹阳市| 红安县| 从江县| 富蕴县| 奈曼旗| 嘉兴市| 河南省| 遂昌县| 马边| 手游| 秦安县|