外行人怎麼了,一樣能看明白加密與通訊

weixin_34198881發表於2018-12-27

看了那麼多諜戰片,比如說偽裝者,黎明之前,潛伏,風箏等等,吸引我們的除了精彩的打鬥環節,另一個就是破譯密碼。密碼對人們總有一種獨特的誘惑力,在諜戰中有趣的密碼經常讓人事後會拍案叫絕,那麼今天我們們就來聊聊這神祕的加密與通訊吧。

 本篇文章閱讀大約需要15分鐘,看完一定會讓你受益匪淺!所謂大神,除了技術水平高,化繁為簡也是一流,很深奧的東西也可以做到通俗易懂!話不多說,進入正文吧:

知乎上有一篇介紹網路安全的文章,其中關於HTTP/HTTPS以及密碼儲存的相關內容甚是有趣,文中談到登入過程中一定要使用HTTPS而不能使用HTTP,否則中間人攻擊將很容易取得使用者的密碼。其實這個說法並非完全正確,密碼的安全性並不能因為使用了HTTPS就高枕無憂,也並非使用了HTTP就不安全。

什麼是加密?

 

加密是將一種資訊表達變成另外一種資訊的表達方式。一個生動的例子就是在外地,你和老鄉交談時用普通話表達“我愛香菜”和用方言表達”我愛香菜”是一個意思,但是其他人恐怕會聽不懂方言。

另一種就是對映關係了,就像下面這張對應表,實際上你可以叫它對映表,就是把一串資料對應某種關係變成另外一串資料。如圖所示:

 

假設我們將沒有加密過的資訊叫明文(A),加密後的資訊叫密文(C),設B為加密方式,那麼加密的過程就可以寫成類似A•B=C,當然解密過程就是

你的鑰匙安全麼?

 

假如我們有五個數字要告訴對方,分別是1、2、3、4、5,加密就是將每個數字乘以2,於是對方就收到了密文2、4、6、8、10,對方只需要將每個數字除以2就能取得明文1、2、3、4、5。

在這個過程中,2作為整個加密過程中最關鍵的數字,可以說是整個加密解密的鑰匙,你就需要好好儲存了,一旦讓別人知道了你的金鑰,你的加密將會形同虛設。

假如你需要和一個不認識的人進行加密通訊,你如何保證你的鑰匙能交給你的接頭人呢?當面交易不管是在密碼還是網購都屬於一個比較靠譜的方式,但是如果你想通過信件的方式,就要經過一堆不知名的郵差郵局,最終到你的接頭人手中。

但是你會擔心中間有沒有人把你的鑰匙給拷貝了一份,你無法保證中間人會不會出賣你,然而你卻不得不把自己手中的鑰匙交給他們,否則你的接頭人就無法使用它來和你進行加密通訊了。

儘管這種方式和我們實際說的密碼學多少有點不一樣,但是它確實給了我們一些提示,例如設明文為A,金鑰為B,密文為C,是否存在一種加密函式使得:

A•B=C

C•D=A

簡單來說就是加密的金鑰和解密的金鑰不一樣,這樣我們就不用擔心金鑰被洩漏。在現實中有點像這麼一個過程:

1、首先準備一個帶鎖的箱子,用鑰匙把這個箱子開啟(公鑰);

2、把這個箱子交給郵遞員,同時箱子裡附上一個字條,上面寫著:請接頭人想一個我們之間的通訊加密方式,然後把金鑰也放在箱子裡鎖上寄回給我;(通過公鑰加密)

3、當這個鎖上的箱子再次回到你手中時,用鑰匙開啟箱子,取得金鑰和加密方式;(私鑰解密)

4、之後就可以用這個加密方式和金鑰進行通訊了。

上面這個辦法完美地避免了中間人看到你和接頭人金鑰,畢竟在交回來時,它可是鎖在箱子裡面的,只要你發現收回來時這個箱子有什麼不對勁,你立即可以編輯簡訊“有內鬼,終止交易”。

雖然最後放在數學中這個方式有點不同,但在思路上卻是大同小異,你也許已經發現了在高中的階段,要計算

要簡單的多,當代的不對稱金鑰技術(公鑰加密),大多都用上了這種資訊不對等的理念,也就是正推容易逆推難。

談到公鑰加密,就不得不聊聊目前相當有名的RSA和ECC了,相對於ECC,RSA理解起來就容易的多,RSA加密簡單來說利用了大數質因數分解的數學難題:

比如現在你可以隨便挑選兩個素數,例如59、83,然後將它們乘起來59*83=4897,即使是一個小學生也能在十幾秒內算出來,但是如果我只告訴你4897這個數,然後讓你做因數分解,八成你需要一個一個去試數了。

假如這兩個素數挑選的都非常大,那麼就算是超級計算機上場,恐怕也得算到世界末日了。但幸運的是,理解RSA加密並不複雜,即使是在這短短的篇幅中,也很容易將RSA的原理給講清楚。

因此上式最終變為了x%n=x,RSA得證,要破解RSA,那麼關鍵就是找到這個d了,我們看看d是怎麼來的,首先從點3我們知道,要知道d首先要先知道k,而k=(p-1)(q-1)也就是需要知道p和q了,我們公佈的只有一個e和n,按照不成文的欽定就算e是65537,也就是說我們必須通過n倒推出p和q,那麼問題就變成了這個大數因數分解的世紀難題了。

RSA已經流行了多年,很多時候這套理論就會被爆些大新聞讓人感覺其安全性已經搖搖欲墜,但是最終RSA仍然屹立不倒,也許在之後的某一天量子計算機誕生或者哪個大神真正找到了某個快速大數的質因數分解的方法,RSA也算真正完成它的歷史使命了。

公鑰加密技術有許多優點,但其缺點也一樣很明顯。大多的公鑰加密演算法其效能開銷基本都比金鑰對稱加密大得多,因此他們一般都不用於加密大量的資料。

在實際使用中,它們大多被用於交換其它更加經濟快速的加密金鑰對,或者被設計與數字簽名,如果你想進一步瞭解RSA,可以在網際網路上查詢相關資料。

HTTP/HTTPS

 看到小標題你可能會犯嘀咕,剛說完密碼怎麼突然就跳到HTTP/HTTPS上來了呢,一個非常直觀的理解就是,HTTP就是你用明文來寫情書,HTTPS就是你的情書加密了,實際上後者就是前者加密後的產物。

那麼什麼是HTTP呢?你可以開啟一個網站如果你用的是chrome,那麼按下F12,你可以看到有一堆文字:

 

這段文字就是符合HTTP規範的的文字(當然HTTP協議相關的細節資訊已經省略了),你可以管它叫網站原始碼,或者簡單一點來說就是這段文字經過解析後變成了你所看到的網頁,當然,這個原始碼可以在網際網路上傳輸,就像你把情書交給了一個不靠譜的郵遞員一樣,這個郵遞員可能已經被你的情敵收買了,把你的信件拆開來添油加醋地加一點東西然後再神不知鬼不覺地封回去。

這樣足夠給你造成一些情感危機了,但HTTPS能夠很好的避免這一堆問題,因為這段文字被加密了,如果不知道解密手段的話,即使新增了一些東西解密後也會變成一堆意義不明的資料,收信方也很容易察覺出問題,因此HTTPS顯然在防篡改方面比HTTP要安全。

那麼HTTPS是否就一定比HTTP安全呢?HTTP是否一定就不安全呢?就像知乎文章的作者所說,不管怎麼樣一定要使用HTTPS做密碼的登入框,不然密碼就會被洩漏。

其實這句話就有點像屠龍寶刀如果給一個菜鳥的話,恐怕真到約架時也會被砍的娘都不認識,假如把一根樹枝給獨孤求敗這種人物,就算是在多人一起上也是被扁的哇哇叫,打鐵還需自身硬,如果自身都不夠硬,真要幹起架來,哪怕是再好的武器也於事無補。要理解HTTPS為什麼安全?安全在哪裡?我們就得去深入探究。

HTTPS和中間人攻擊

 

有關於HTTPS的傳輸流程是怎麼樣的,可以看到HTTPS比HTTP就多了一個字母S,這個S代表著SSL(Secure Socket Layer)的意思,也就是安全傳輸層。

首先SSL層先使用公鑰加密技術交換金鑰對(比如RSA,ECC….),之後再使用AES DES或者更經濟點的RC4進行加密通訊,看上去這個交遞箱子的方案似乎沒有什麼問題,但我們回到那個交遞箱子的過程:

1、首先準備一個帶鎖的箱子,用鑰匙把這個箱子開啟(公鑰);

2、把這個箱子交給郵遞員,同時箱子裡附上一個字條,上面寫著:請接頭人想一個我們之間的通訊加密方式,然後把金鑰也放在箱子裡鎖上寄回給我;(通過公鑰加密)

3、當這個鎖上的箱子再次回到你手中時,用鑰匙開啟箱子,取得金鑰和加密方式;(私鑰解密)

4、之後就可以用這個加密方式和金鑰進行通訊了。

我們做一個假設,假設這個郵遞員準備了一個和你一模一樣的箱子,然後偽裝成你的接頭人和你通訊,再用這個偽造的箱子和你真正的接頭人進行通訊,那麼你還能保證你的通訊是安全的麼?

恐怕這個時候,即使是公鑰加密技術也無能為力了,我們能做的只是儘量提醒接頭人,比如在箱子上蓋個印章條形碼,並方方正正地寫上“此箱子版權所有,仿冒必究,請到xx正品店進行專櫃驗證”,然後祈禱你的接頭人會好好地驗證這個箱子的真偽,但鑑於你和接頭人從未謀面,恐怕他也並不知道你會不會給他寄個“帶有防偽標籤的箱子”。

這個過程幾乎和SSL的理念一樣,每個HTTPS的站點需要向一個可信的第三方CA(數字證書的頒發機構)申請一個證書來向每一個瀏覽你網站的人證明你的資訊,但瀏覽你網站的人可能根本無法意識到,你的網站是否進行過防偽了,這種中間人攻擊的手段又叫SSL剝離攻擊,其原理圖如下:

 

如何避免中間人攻擊?

 

如果你的網路流量出入口真被某些居心叵測的破壞分子控制的話,你能做的就是儘量祈禱這個傢伙的技術水平不夠,搭建一個SSL剝離的攻擊方案也許就是一個黑wifi,一次ARP劫持和幾個指令碼的事情。

實際上避免攻擊的準則除了選擇一個可以信賴的網路服務商,更多的工作需要在自己設計的程式碼中去實現而不是盲目地相信某種通用的手段(當然不是說HTTPS不好用,有條件當然還是最好用上),一個最基本的理念是,如果攻擊你的成本遠遠大於攻擊成功取得的價值成本,就能夠很大程度的避免自己被一些別有用心的大佬而不是吃的太飽的大佬擺上一道,這也就是為什麼我們學習密碼學的原因。

如果你能將那些更加複雜的公鑰加密技術設計在你的通訊體系中,設計的程式能夠利用這些知識去驗證收到資料的真偽(比如驗證可信CA頒發的簽名證書)那麼攻擊者就需要花費更大的代價去剝離你的驗證部分,或者根本就不可能在偶然的一次通訊劫持中完成這類攻擊。

但遺憾的是在程式碼通用化程度如此高的今天,儘管很多軟體運用了完善的加密體系,最大程度地保證了通訊的安全,但大部分因為開發成本或者是其它的關係,開發人員並沒有好好的給自己充個電,認為使用現有的安全架構就能夠一勞永逸去避免一堆可能帶來的問題。

例如這個登入的驗證問題,處理起來遠遠不是弄個證書整個HTTPS就能夠解決的,但不論是出於開發平臺還是出於開發成本或者是開發員的技術水平,絕大多數的網站在保證安全這塊都還有很長的路要走。

除了開發人員,最後是寫給使用者的安全建議:

1、請在信任的網路中下載程式或流量網頁;

2、如果你連結了一個不信任的網路,請不要瀏覽不帶有效簽名的網站;

3、不要下載沒有有效簽名的軟體,如果你信得過這個沒有簽名的軟體,也要在信任網路中下載;

4、瞭解密碼安全的一些知識;

5、找個靠譜的碼農朋友。

雜湊函式(hash)

 

雜湊函式俗稱hash函式。在開始科普關於hash函式之前,首先談談大約五六年前CSDN資料庫洩漏的事件,儘管我們無法猜測csdn到底出於什麼目的將使用者的密碼進行明文儲存,但這個事件無疑在圈內掀起了軒然大波,無數無辜躺槍的碼農程式猿忙著修改自己的賬戶密碼,避免被某些別有用心之徒用撞庫的手段給自己造成損失。

倘若csdn不使用明文記錄使用者的密碼資訊,而將這個密碼用某種不可逆的手段編碼成其它的資料,至少不會造成如此巨大的損失。

hash函式到底是什麼呢?按照百度百科的說法,就是指通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。說的太專業了?沒關係,除法求餘數總會吧,看下面的式子:y=x%99

這是一個很簡單的求餘運算,x表示輸入的某個整數值,y表示輸出的值,顯然不管x取多少,y的結果必定在0-99,如果你知道y的值,那麼能不能求出x的值呢?很遺憾也許你能找出很多個符合這個條件的x值,但你恐怕永遠不能確定原始的x值是哪一個了。

整數求餘運算是一個非常簡單的雜湊運算函式,或者通俗點叫hash函式,但這是一個不合格的hash函式,因為我們可以非常容易地通過輸出y求得多個x的可能解,並且x和y在一定的範圍記憶體線上性關係,而理想的hash函式是正著算容易,倒著算難,同時輸入的輕微變動也將導致輸出極大的不同。

那麼這就很有意思了,假如我們在資料庫儲存密碼時,使用適當的hash函式對其進行編碼,那麼就能夠避免我們的密碼明文被洩漏了,說到這裡必須要提一下當今赫赫有名的幾個hash函式,比如MD5,SHA256。

這就安全了麼?

當明文的密碼使用MD5或者是SHA256後,想要再逆向為明文是不大可能的,但這還不足以讓你高枕無憂,畢竟不久前剛報出個大新聞MD5被破解了!

當然被破解這種標題黨的行為在學術上來說極為不準確,準確來說是MD5被找到了一種能夠快速找到碰撞的辦法,那麼碰撞是什麼呢?我們回到之前的y=x%99,如果我們知道y的值是1,那麼x的值是多少呢?顯然x的值可以是100,可以是199,可以是298….

如果我們用求餘法作為密碼的hash函式,那麼我們輸入199,298…哪怕我們的原始密碼是100,也會被當做是正確的密碼,也就是說,199,298是100對於該hash函式的碰撞結果。

這可就要命了,明明黑客輸入的密碼和我們輸入的密碼不一樣,系統還是將它當做了一個正確的密碼讓他登入了,這簡直就是密碼系統的災難,既然MD5不再安全了,那麼就放棄MD5專用SHA256吧。

然而還是太天真了,我們忽略了一個最基本的事實,如果明文的密碼長度不夠,那麼不管加密的手段如何的高明,我們也能通過窮舉的方式進行破解,比如你的密碼是一個三位數的數字,那麼我只需要把100-999都嘗試一遍,就可以知道正確的結果了,也許用人腦這個辦法有點難,但是在計算機當中,完成這個窮舉連1秒都不用。

實際上確實也有人這麼幹了,他們購買了大容量的儲存裝置,收集大量常用明文密碼進行hash函式計算,同時他們建立了快速的查詢機制,只要你的密碼長度不夠或者使用了一些常用的密碼,那麼hash函式對你明文密碼的保護機制將很可能不再有效,而這種方法在網上有個比較漂亮的名字叫彩虹表

給密碼加約束

為了避免彩虹表的危機,我們必須對密碼加一系列的約束,比如我們可以規定密碼的長度,一定要大小寫組合的8位以上,16位以下,然後在密碼的結尾加上一段我們自己想出來的隨機的值增加輸入長度,以避免常規計算的的彩虹表對我們的密碼進行暴力破解。這是一種非常流行的做法,用專業的術語來說就是加鹽(salt),那段隨機的值就是我們所說的鹽值,這個效果的確非常有效。

如今已經證明不安全的MD5在尋找碰撞不是那麼的快的時候,只要這個salt足夠長,的確能夠在一定程度上緩解這次的危機問題,但不管如何,我們仍然應該摒棄那些不再安全的hash函式,使用目前相對安全的hash函式。同時在設計通訊架構時,永遠不要相信當前的密碼手段是永恆不破的,畢竟這就和明天我會不會中個億元大獎然後走向人生巔峰一樣,誰又說得清呢?

你或許感興趣的,請去i春秋官方公眾號檢視

1、Web安全學習攻略,值得收藏!

2、瞭解iOS URL Schemes

3、資料庫安全體系構建

4、刺透內網的HTTP代理

5、利用Burpsuite學習注入工具語句 

6、滲透技術的使用案例

相關文章