信息的保密和認證(1)

我們在互聯網上發佈和接收著各種各樣的信息:瀏覽網頁,發佈文章,下載文件,上傳視頻,網購……諸位,我們肯定希望自己接收或發佈的信息不被篡改吧?我們肯定不希望自己被釣魚吧?我們也不希望自己幹了嗎都被別人看得一清二楚吧?

很可惜互聯網先賢們在設計互聯網的時候重點放在連接上了,而沒有考慮安全,導致我們所熟悉的互聯網到處是漏洞:

1,信息是以明文的方式傳輸的,也就是說,路上隨便誰都可以看到信息內容;

2,通信雙方沒有身份認證機制,隨便來個傢伙都能冒充其中一方進行通信(想到釣魚網站了嗎?)

3,沒有對信息的完整性校驗機制,導致第三方能隨意篡改信息(例如對下載的軟件掛馬)

沒辦法,後人只能當救火隊員了!各種加密算法由此而生,DES,AES,RSA,Diffie-Hellman……說起加密,那可是一門複雜的學問,對稱加密和非對稱加密,各種不同的加密算法,他們各有各的特點,各有各的適用範圍。例如對稱加密(加密密鑰和解密密鑰是同一個)適合給大量數據加密,多用於維持加密連接;而非對稱加密(加密密鑰和解密密鑰不同)適合給少量信息加密,再加上加密密鑰和解密密鑰不同,多用於在不安全的信道上完成密鑰交換建立加密連接。(這只是很簡單的介紹,我有空會仔細聊聊,密碼學非常複雜)

大概會有人認為有了加密算法之後就萬事大吉了:只要保管好密鑰,信息在傳遞過程中自然不會被第三方得知內容,面對無意義的密文,第三方也無從下手,可以說通信雙方是高枕無憂了!

哪有這麼美好的事情?

首先很多時候都沒辦法事先保管密鑰的,例如用戶和網站發起連接,請問怎麼事先商定密鑰?線下商量嗎?而如果線上商量,那麼第三方就可以製作釣魚網站,誘使用戶落入陷阱。

還有就是,第三方雖說無法得知通信內容,但照樣可以搞鬼:第三方可以在密文中增加或減少幾個字符,從而完全改變內容;還可以複製密文,再進行重放(即重放攻擊,例如截取並重放cookie,可以直接在不知道用戶名密碼的情況下完成登錄,從而偷取賬號);也可以把木馬加入進去(特別是下載的時候)。

而且不僅僅第三方會搗鬼呢。想像一下這樣的場景:A和B達成了一筆交易(B以一定價格向A買了一定數量的貨物),A送去了一條確認信息(確認B花C美金買了D噸貨物),然後B就把錢打到了A的賬戶裡;可是等B向A索取貨物時,A賴賬了。A說:”我從來沒有送過什麼確認信息。“

對,A和B的通信一直是加密的,兩者事先商量好了密鑰。可是當B提出了這一點時,A卻說:”首先,你怎麼證明和你商量密鑰的是我?而且你也完全可以自己偽造一條確認信息,然後說是我發的。“B沒有辦法了。

如果A和B有多筆交易,情況會更複雜:A和B正常完成了第一筆交易,但是在第二次交易的時候,貨物價格暴漲了。B不想當冤大頭,就故意複製了第一次交易時A的確認信息,然後取代了第二次交易的時候A發送的確認信息。A發現不對,就找到B說:”這根本不是我發送的信息!“然後B很淡定的說:”拜託,這就是你發送的好不好?不信你自己看看!“A發現這信息和第一次的確認信息一模一樣,懷疑B複製並替代了信息,但是找不到任何證據。

怎麼解決呢?

首先是雙方要都有身份證明(具體拿什麼做身份證明合適以後再說,總之要有身份證明,否則就可以隨便賴皮了)

然後該怎樣解決偽造和複製的問題呢?

對付複製其實很簡單:time stamp(時間戳),在每條信息上都打上時間戳,這樣就能識破冒充新信息的舊信息了。

那偽造呢?這就比較複雜了。
如果採用對稱加密,那麼有個問題始終解決不了:雙方都可以偽造對方的加密信息然後互相賴皮(如果說雙方直接通信的話),除非…..

老大哥出場!老大哥知道一切,所有人都信任老大哥,這是前提;因為只要有一個人不信任,那就又可以賴皮了。
直接看圖吧[1]:A是A的身份證明,B是B的身份證明,RA是A生成的隨機數,t是時間戳,P是確認信息內容,KA括起來的是A用自己的私鑰加密的信息;A將信息傳送給老大哥,老大哥解密之後再用B和自己的密鑰BB重新生成信息,其中的KBB加密部分是B無法解密的。

A發送了確認信息之後依舊想賴賬,於是就宣稱自己沒發送過什麼確認信息;B自然不干,於是就把A告上法庭。

法官:”B,你憑什麼說這確認信息是A發送,而不是你或者其他什麼人偽造的?“

B:”首先,如果說是我自己偽造了信息,那麼老大哥就絕對不會接收到這條確認信息並進行重新處理的。“

法官:”老大哥,你接收到了A發給B的確認信息了嗎?

老大哥:”查詢記錄中………我接收到了!“

B:”我們都信任老大哥,沒錯吧?時間戳和隨機數可以證明這條信息不是複製而來的。還有一點,如果法官大人你還不相信我,那麼可以請老大哥解密這條我無法解密的信息(也就是KBB加密的部分)“

法官:”老大哥,請解密這條信息。“

老大哥:”OK……解密成功!內容是A的身份證明和時間戳以及確認信息的內容!“

法官:”這樣就可以確定了,這條信息不可能是其他人偽造的(因為其他人不知道老大哥的密鑰,無法偽造出KBB部分),A,這條確認信息就是你發送的!不要想賴賬。“
案件關閉。

聽起來很完美,問題在於……上哪找這樣一個老大哥去?政府?哈,千萬別開玩笑,最不能相信的就是政府了!

那麼就只能依靠非對稱加密算法(公鑰加密算法)解決問題了:還是請諸位直接看圖[2],A先將確認信息內容P用自己的私鑰DA加密,然後再用B的公鑰EB加密,然後發送給B,B再用自己的私鑰DB和A的公鑰EA解密得到P(圖中省略了時間戳,當然還是要有時間戳了)

現在,我們親愛的A還是想賴賬,於是B又把A告上法庭了。

法官:”B,你怎麼證明這確認信息是A發出的?“

B:”我手中有用A的私鑰DA加密的信息DA(P),只有A能做到生成這樣一條信息,因為只有A知道私鑰DA!“

法官:”我用公開的EA解密看看……啊,結果是P,也就是說這的確是A生成的信息。A,這確認信息就是你發出的,不要想賴賬了!“
案件關閉。

不過公鑰加密算法方案也不完美:A可以賴賬說自己的私鑰丟失了,或者A更改了私鑰而B用的是原先的公鑰進行解密,結果B又沒辦法了。

下次聊聊散列值吧。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *