網絡安全(1)-身份認證


網絡數據安全

    現在在網絡上兩個節點A和B之間進行通信的時候,數據包經過的路徑上很有可能會有很多的路由節點。在這些中間路由節點上,A和B之間的IP包是完全可以被截獲、修改、甚至丟棄的,因此在網絡上的數據傳輸並不安全,或者說基本的網絡7層協議並不確保數據傳輸的安全性。 
    數據的安全傳輸對用戶來說意義重大,顯然,沒有用戶願意忍受自己所發送的每一段消息、傳輸的每一份文件都有可能被另外一個不相干的人偷窺。因此,在不安全的網絡上構建安全的通信非常重要。 
    要在網絡上進行數據的安全傳輸,主要需要實現兩個方面: 
(1)身份認證,用於確定你數據的來源是你預想的。 
(2)數據加解密,用於對傳輸的數據進行加解密。 
(3)數據完整性校驗,用於防止數據被篡改。

身份認證

    身份認證是對數據的來源進行確認,比如用戶A和用戶B通過網絡傳輸數據,他們都希望自己收到的數據是來自B和A,而不是由其他人偽造的;某機構發布了一個文件,用戶A從網上下載了該文件,他希望該文件確實是由該機構發布的,這些都可以通過身份認證來得到保證。 
    現在常用的身份認證方法是使用證書。 
1、證書使用 
    證書就是一個公私鑰對中的公鑰(公私鑰在后續RSA中會具體講),公私鑰是非對稱加解密的實現方式,公鑰加密的數據,只有對應的私鑰才能解密,反之亦然。 
如果某機構申請了一張屬於自己的證書,然后向互聯網用戶公開該證書,用戶如果接受,則將證書存在電腦中。之后該機構在發布數據的時候,帶上簽名,簽名可以是一個明文字符串X+經過該機構私鑰對X加密后的結果Y。當用戶收到數據之后,通過該機構公開的證書(公鑰)對簽名中的Y進行解密得到Z,如果此時Z和X相等,則可以判定該數據確實是由該機構發布的。<私鑰加密,公鑰解密>

2、證書申請/頒發 
    頒發證書crt,頒發證書當然不是誰想干就能干的,這得有專門的證書頒發機構來執行這項權利。CA(Certificate Authority,證書授權中心)是負責管理和簽發證書的機構的第三方機構,一般是權威可信的、經過國家認證的部門。 
    如果某機構或網站想要一個證書用於向用戶證明自己的身份,它首先要想CA申請,CA如果同意申請,會簽發一張證書給該機構。此時該機構或網站有了證書,它向網絡用戶公開的時候,怎么讓人們相信這張證書確實是CA頒發的而不是自己偽造的呢?首先,CA是權威機構,它自己也有證書,且證書一般都會被用戶接受存放在電腦中;然后,CA在證書的末尾會添加一段簽名(和上面的X加密得到Y一個道理),用戶在收到新頒發的證書之后會通過自己電腦中存放的CA機構的證書去解密從而可以校驗該證書是否是CA頒發。

3、證書層級與信任鏈 
    證書是分層級的,每份證書(除了根證書)都會指定其上級CA(頒發該證書的CA)的名字,系統根據名字定位到系統中的CA證書;其上級CA的證書也會指定其對應的再上一級CA的名字.....直到根證書,根證書是不需要證明的。 
-windows系統自帶了一些CA證書,大部分是美國的CA頒發,中國用戶應該先安裝一個工信部的根證書,該證書應該是美國的CA簽發,國內的其他機構再向工信部申請證書。 
    根證書一定是可信的,這是證書安全體系的根本。根證書信任的那些證書也應該是安全的,根證書信任的那些證書信任的證書也應該是安全的,這樣一級一級往下傳.... 如果中間有證書不遵守規則,信任了不安全的證書,那么后續的證書鏈均有可能不安全......比如前段時間支付寶偷偷在用戶的電腦里添加根證書,這種行為私自修改的信任鏈規則,添加的根證書可能會信任一些不安全的證書,從而給系統帶來隱患。

使用證書進行身份認證

使用公開的證書

    https協議中,瀏覽器就是通過證書來驗證服務器是否合法的。 
    服務器首先會向CA申請證書(如果沒有向CA申請,則在訪問的時候瀏覽器會提示用戶是否信任該服務器提供的證書);瀏覽器在訪問https服務器的時候,https服務器最開始就將自己的證書發送給瀏覽器,如果服務器的證書是向CA申請過的,瀏覽器可以通過本地機器上CA的證書對服務器的證書進行確認(通過CA的公鑰進行解密,判斷簽名是否一致);如果服務器的證書沒有向CA申請過,則瀏覽器會發出警告,此時可以將該證書添加到“受信任的根證書頒發機構”存儲區,就不會再收到安全提示了(當然要確定該網站確實沒有問題)。 
    確認了證書沒有問題之后,我們怎么確定證書確實是由服務器發送過來的,而不是另外一個網站提前獲得了證書,然后再發給瀏覽器的呢?(如果是那樣,則說明瀏覽器建立連接的對象搞錯了。之后即使瀏覽器進行對稱加密的密鑰不會被假冒的服務器獲得,因為瀏覽器會用正確網站的證書公鑰加密,而只有擁有私鑰的正確的網站才能夠解密,但是至少瀏覽器無法正常的通信...) 
    可以這樣,瀏覽器先隨機生成一個字符串,然后傳送給服務器,服務器用私鑰加密,並將加密之后的結果返回給瀏覽器,瀏覽器用公鑰解密,查看是否是之前隨機生成的字符串。假冒的服務器沒有私鑰,因此無法對字符串進行正確的加密,從而瀏覽器會得出錯誤的結果。這樣,就可以通過證書驗證對方就是真正的服務器。 
    當然,上面的過程也可能被一個假冒的服務器破壞:瀏覽器發送字符串給假冒的服務器,假冒的服務器沒有私鑰因此無法加密,但是它可以直接將字符串發送給真正的服務器,真正的服務器返回結果之后再將結果轉發給瀏覽器,這樣仍然可以欺騙瀏覽器讓它以為自己是和真正的服務器在通信。但是,這樣做對假冒服務器來說除了破壞了瀏覽器的通信之外,並無法獲取、篡改機密信息,因為瀏覽器在建立和服務器(無論是真正的服務器還是假冒的服務器),都會再生成一個對稱加密的密鑰,之后在通信的時候都使用這個密鑰進行加密,而只有真正的服務器才能夠通過私鑰解開這個密鑰,假冒的服務器除了獲得加密之后的數據之外,其他什么也做不了(當然,它可以修改數據,但是這可以通過數據的完整性校驗被發現)。因此,只要身份認證沒有問題,中間人攻擊就無法進行。

使用預設置的證書

    在搭建vpn服務器的時候,也可以通過手動在本地存儲對方服務器的證書,從而在之后進行雙方服務器的身份認證。服務器都先在本地生成公私鑰對,然后將公鑰拷貝到對方的機器上,這樣之后在進行通信的時候,就可以使用公私鑰對來進行身份確認。

使用臨時分配的證書

    有可能通信雙方需要臨時在網絡上交換公鑰,他們網絡比較安全,交換的公鑰並不會被竊取,但實際並不是這樣,此時就會出現一種更為可怕的中間人攻擊:

假如A和B認為,任何網站都是不可靠的,他們從未並且今后也不會在網上公布自己的公鑰。為了加密通信,A需要親自告訴B他的公鑰,B也需要親自告訴A自己的公鑰。收到公鑰后,雙方便用對方的公鑰加密進行數據傳輸。因為用這個公鑰加密后,只有對方才能解開密碼,因此雙方都認為這條通信線路是安全的。其實,他倆的麻煩大了。這條線路並不是安全的,第三者可以用一種很搞笑的方式來竊聽消息。假設有一個人C知道A和B之間將有一次加密通話。C劫持了A和B之間的通訊線路。現在,A把他的公鑰發給B,這個公鑰傳到一半時被C攔截下來,於是C獲得了A的公鑰;C再把他自己的公鑰發給B,讓B把C的公鑰錯當成A的公鑰。同樣地,B把他自己的公鑰發給A,被C攔截下來。C把自己的公鑰發給A,讓A以為那是B的公鑰。以后,每當A給B發加密消息時,A其實是用C的公鑰在加密;C把A的消息解密后,再用B的公鑰加密后傳給B。類似地,一旦B給A發送消息,C都可以將消息解密,並用A的公鑰進行加密后傳過去。此時,A和B都以為自己在用對方的公鑰加密,並都能用自己的私有鑰匙解開對方傳來的密文;殊不知,這中間有人僅僅用了一點雕蟲小技,無聲無息地竊走了所有的信息。C正是利用了公鑰加密術“誰都可以加密”的性質,結結實實地玩弄了A和B。

    那么,如何防范這種中間人攻擊呢?

中間人之所以能夠得逞,關鍵就是,無論是網絡通話還是國際象棋,雙方總是一先一后地發送信息。不過,在網絡通訊中,我們有一種很特別的辦法,他可以迫使中間人無法再扮演“即時翻譯”的角色。首先,A把想說的話(最好是能夠證明自己身份的話)進行加密,同時B也完成相同的工作。然后,A把他的加密消息的前面一半傳給B,B收到后也把他的密文的一半傳給A;A再把剩下的部份傳給B,之后B也把他的密文的另一半回傳給A。此時,A和B分別用自己的私鑰進行解密,查看對方發來的消息。這帶給中間人C一個不可逾越的障礙:兩段密文要合在一起才能解開,中間人拿着其中一半密文,那是一點辦法都沒有。此時,中間人陷入了一個非常窘迫的境地,他只有兩條路可選:要么硬着頭皮把這半截密文發給B,當B得到全部密文后會發現用他自己的私鑰根本解不開,從而意識到中間有人搗亂;要么就忽略這半截密文,自己編幾句A想跟B說的話,用B的公鑰加密並發一半給B。如此一來,中間人需要編造所有A和B之間的對話,這需要相當厚的臉皮,風險異常之大,要不了多久便會露出馬腳。

參考

身份驗證、中間人攻擊和數字簽名:淺談密碼學(中)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM