常見的幾種數據加密與應用場景

起因

最近被一個同事問到,在網絡交互中,那部分數據需要被加密那一部分不需要被加密。我覺得這個問題有點太泛了,所以給他科普了一次常見的數據加密與應用場景的課。突然間覺得這個還挺有教育意義的。所以我還是吧這個記錄一下吧。

啊,年輕犯下的錯

當初我們給某個建站平臺做手機客戶端的時候就沒有考慮這些事情,現在想想被攻擊實在是太簡單了。我們當初做的內容其實根本就沒有數據加密的防護,所有的內容都是公開的。尷尬尷尬。

前一段時間的釣魚Wifi是怎麼做的

我想講明白這件事情,你首先得了解一下DNS究竟是怎麼工作的。作爲一篇數據加密的文章呢,我就不做太多的DNS的介紹,這類介紹應該很多。簡單點說,就是通過URL轉換爲IP的一個步驟。很多時候,連接網絡之後,如果你不特殊設置,會遵循路由給你的推薦設置。比如下圖,就是我電腦的截圖。

當我訪問網絡的時候,比如說www.taobao.com那麼瀏覽器會首先查詢這個地址的IP是啥。中間的查詢過程就不描述了,一般會詢問道上圖中的10.8.8.8這個服務器中,然後返回淘寶的正確IP地址,然後發起協議,獲取網頁數據。然後展示出來網頁。當然這個是正常情況下,如果DNS告訴你的網址並不是正常的網址,比如說有人寫的跟淘寶一毛一樣的一個網站你也渾然不知道。如果你在他們網頁上輸入了賬號密碼,然後提交的話。實際上就把這個消息發送給了這個網站的製作者,達到了釣魚的目的。對付小白用戶這樣肯定是一來一個準,不過大部分人在進入這個系統之後就會發現貓膩了,比如說登陸了很多次,明明賬號密碼都是對的卻登陸不上,進入系統之後發現數據不對,比如說,我之前買的東西居然沒有之前訂單了。一般人就會警覺可能被釣魚了。然後修改密碼。這樣釣到賬號密碼就已經失效了。

怎麼來做一個簡單高效,不容易被發現的釣魚Wifi

怎麼叫做個簡單呢?就是我不用去架設各式各樣的假網站,我可以直接截獲真網站的各條網絡協議。當然瞭如果路由器支持這是非常方便的事情。不過我對於這種事情並沒有設麼研究,咱是一個程序員。咱們考慮的當然是怎麼用咱的程序解決這個問題。比如說通過反向代理某些網站,比如說反向代理淘寶。你訪問我的代理跟你直接訪問淘寶是一樣的結果。然後我在我的代理上綁定淘寶的域名。當然了,這樣做一般是沒有效果的,因爲訪問淘寶的請求不會到我這邊來,因爲DNS解析並不是指向我的。但是如果這個路由器是我的,那麼,我就可以讓訪問淘寶的請求指向我。這樣一來,我就建設好了一個域名是淘寶內容也是淘寶的代理服務器,我就能拿到你所有的網絡請求。這只是一個架構設想,千萬別拿來做壞事,咱們只討論技術。其實就是網絡請求的截取,我們也只是簡單的討論這一種還有很多很多請求截獲手段,我們就不討論了。

怎麼進行攻擊防禦

這個命題就變成了

怎麼讓攻擊者拿到你的網絡請求,卻沒有什麼用

起因中也介紹了,這是一個跟一個同事討論引起的帖子,那麼,我先貼上他當時回答。他說數據加密就可以了呀。可是數據加密分很多種呀,你覺得那種數據加密在這個場景下會奇效呢?他說MD5、對稱加密、非對稱加密。實際上這個地方只有一種數據加密是有效的。來,讓我們來分析一下哪個是有效的。

MD5

在用戶密碼的處理中這是一種非常常見的處理方式(儘管MD5從嚴格意義上來說並不屬於一種加密算法,他是將內容提取樣本到一個字符串。因爲之前在做項目的時候,用戶密碼都是用這個處理的,所以作者也誤認爲這是一種加密算法。被多位網友熱情指出,儘管他並不是一種加密算法,但是還是把他放到這裏吧。因爲文章已經寫完了。我有懶得改,就這樣吧)。但是在登陸場景下這種數據加密方式並不常用。如果使用MD5來進行登錄,一般情況需要將用戶密碼 + 當前時間分鐘戳,然後算出一個密文提交給服務器,服務器拿到信息之後,將密碼 + 當前時間和當前時間的前後各一分鐘算出三個結果。如果客戶端提交的數據在三個數據之中,那麼就登陸成功,否則就登陸失敗。不過這種用法比較侷限性。如果你想連用戶名都隱去,這種方式是做不到的。

對稱加密

首先得了解對稱加密是什麼,對稱加密是加密解密用同一個密鑰。前端在加密的時候,你肯定要在前端輸出一邊明文密鑰。那麼傳送的是什麼。找到你的密鑰之後,你傳送的數據不論是什麼都可以直接進行解密。

非對稱加密

這纔是正規改用的方式,在服務器上公開公鑰。客戶端、Web頁面拿到公鑰之後。將內容加密,然後傳送給服務器,服務器進行數據解密。這樣的話,就算是被人拿到你的信息,也不怕你的數據泄露了。因爲沒有地方公開私鑰,只有服務器自己知道。這樣你的賬號密碼就可以得到有效的保護。

那麼加密的時候,我都需要怎麼處理呢?

或許你會這麼想,如果我數據都要加密那得多累?服務器能夠受的了嗎?如果只是登陸部分進行加密,那麼其他的連接信息怎麼保證用戶信息不背泄露呢?會不會存在特殊情況呢?這幾種加密方式都什麼時候會用的到呢?

舉個例子

登陸

前面我們已經講過了,有兩種實現方式MD5+時間戳。或者非對稱是加密方式。

註冊

這個恐怕只能用非對稱加密算法了。因爲你得讓服務器知道賬號密碼的原始內容,卻不能讓截獲者知道。

其他需要身份認證的協議

一般情況下,我們的身份認證是通過一個Token(其實這個東西不一定存在什麼地方,有的時候是放到Body裏邊的有的時候是放到Cookie的,有時候是放到Head裏的,放到什麼地方不重要,關鍵是他的意義)來做的。那麼保護好這個Token就非常重要了,因爲你的Token一旦被別人抓到了。那麼你的消息也就泄露了。其實這個比用戶名、密碼來的還要更加麻煩一些。因爲用戶名密碼你需要拿到原始明文才算數。但是Token不一樣。他直接使用密文也是一樣的,因爲服務器解密之後會發現你上傳來的數據是對的。關於這個,有幾種方式來處理來讓Token失效,這個一會我們在講。

其實聊天中也比較常用

其實非對稱式加密,聊天的過程中用的更多。你想,你的聊天不希望其他人看到的吧。因爲畢竟這個是你的隱私呀。所以一般是兩個客戶端互持對方公鑰,然後發送消息。不過如果傳送對象是一個羣,你需要發送消息給每個人。如果這個羣裏邊有200個人,那麼你需要將內容壓縮成200種密文然後發送嗎?那也忒費勁了。好在我們還有對稱加密,我們可以首先使用非對稱加密的方式,將對稱加密的密鑰發送給個個人,然後將內容通過對稱加密加密,然後發送給個個人,讓他們用之前的對稱加密的密鑰解密,就可以完美的解決這個問題。當然了,對於大點的內容也是一樣的。因爲非對稱加密的性能是比不上對稱加密的。

日防夜防,家賊難防

其實很多時候,自己人是比較難搞的。比如說密碼的問題吧。早期的網站很多時候,賬號密碼就是明文的(安全意識不強,當然了早期嘛,誰都會犯錯)。這個時候運營打開自家數據庫。那麼所有的賬號密碼那是一覽無餘呀。這種時候只能靠運營的節操來保證數據不會被偷了。就算是運營不會自己偷這部分數據。但是你要知道,總有一些黑客能夠偷偷溜進服務器,偷了一塊數據庫。如果你有加密(不可逆加密)的話,就算拿到數據庫也是沒有什麼用的,因爲密碼那一欄被幹掉了。這樣保證最起碼,賬號密碼不會同時被盜。話說我的所有賬號密碼都基本上是一套,一套掉了,基本上全套都得換,這是意見非常恐怖的事情。(因爲場景用的多了,難免會有一些你想不到,沒有去改的,卻給你帶來比較嚴重的後果)

怎麼讓Token失效

服務器端更換密鑰

因爲密鑰更換了,所以所有的加密使用原來公鑰加密的數據都會失效。所以可以達到更換Token的目的。不過這樣的確定十分明顯,因爲你是在同一個時間點上換的,所以所有數據都會失效,然後重新拉取憑證。這個時候服務器壓力應該會很大。再一個就是沒什麼用,因爲攻擊者可以在失敗之後直接獲取一個新的有效Token就可以了。

客戶端服務器數據協同

就是讓服務器跟客戶端數據保持時間上的一致性,一般情況下要求保持分鐘數據相同就可以了。這樣客戶端算出來自己的Token + 時間分鐘戳的密文,然後發送給服務器。服務器接收到密文不需要解密(因此這種是使用不可逆加密算法更爲靠譜),直接算出三個結果 (Token + 當前時間和Token + 當前前後各一分鐘的時間)判定用戶上傳的數據是否屬於這三個之一,如果是屬於就通過,不屬於就不通過。

客戶端的每一個Token都是不一樣的

客戶端(或者Web網頁)用自己的Token + 當前的時間戳(假定不會再同一時間上有多個請求,時間戳可以定的單位更小一些或者進行排隊)生成一個密文,然後發送給服務器。服務器拿到密文之後解密,獲取並驗證Token如果Token通過了就看時間戳是不是在上一個時間戳之後。如果不是在上一個時間戳之後,那麼就驗證失敗好了。

後記

可能比較亂這個,我也是想到什麼地方,就寫到什麼地方。歡迎在下方評論。

說明

MD5其實並不能算作是一種加密算法,因爲加密算一半要牽扯到解密。MD5是一種摘要算法,就是從大數據塊中摘取特徵碼的一種算法。文中將他作爲一種不可逆的加密算法來看待,當然這是不準確的一種說法,望周知

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章