擔心酒店資訊洩露,我用Python寫了段加密演算法,看你怎麼破
前段時間的酒店資訊洩露事情,鬧的沸沸揚揚!確實我們很多的資料在網路上都是裸奔,在資料庫裡面躺著也都是明文資料,連我自己的寫某某程式都被熱情的粉絲攻破!不如,我們用萬能的Python寫段加密資料傳送玩玩,也許就能避免酒店資料洩漏了!
-
簡單的場景:
-
Server:Welcome
-
Client: Hi,I am 007 !
-
Server:Goog Monning 007.
-
Client: My password 1234!
-
Server:OK,Receiver your password.
上面是模擬簡單的CS場景,算是很典型的socket互動場景,裡面的使用者名稱和密碼都是明文傳送的,相當不安全,我們用程式碼來演示一下。
01.模擬客戶端-服務端
Python裡面的庫真的是非常多,只有你想不到。基本上你想要做的大部分事情都有現成的輪子,不用自己造,socket當然也有!
1).建立Server端
用socket模組建立一個套接字物件server,繫結本地的ip和埠,埠要用冷門的埠!
2).響應Client端的請求
服務端需要響應客戶端的請求,我們從sock裡面獲取資料,然後再給client迴應一段echo訊息.
我們用一個死迴圈來不斷的處理客戶端的請求訊息,這裡為了簡單處理,我們不做任何的資料分析,只是接受client的資料,然後從隨機應答佇列裡面,挑一條訊息發給客戶端。(注意sock裡面傳送全部都是byte型別,需要做str和byte的轉換)
3).響應多個Client的請求
為了更多更快的處理客戶端的請求,我們這裡用多執行緒來處理,來一個請求,我們來一個執行緒.
4).建立Client端
也是建立socket物件,建立client端,然後繫結本地地址和埠。
5).客戶端傳送資料給伺服器
我們傳送兩條資料給伺服器,一條是"我是007",一條是"我的密碼1234"。
好,經過上面5步,基本上一個簡單的socket通訊程式碼就出來了。整個程式碼量不超過100行,我們簡單執行一個看看什麼效果:
伺服器:
客服端:
那麼問題來了,我們的使用者名稱和密碼都是明文傳送的,有麼有辦法加密呢,當然有,初級加密登場!
02.初級加密
上面的步驟完成了一個client/server的通訊,但是我們的重要資訊都是明文,完全暴露了,稍微用一個小爬蟲就能搞定你的資料,這樣太不安全了,我們用Python裡面的base64模組來加密一下,稍微偽裝一下:
>>紅色部分就是加密過的密文
raw msg: b'Hi,I am 007'
decode msg: b'SGksSSBhbSAwMDc='
restore msg: b'Hi,I am 007'
裡面Python裡面強大的base64這個模組,這個模組是一種查表的編碼方式,可以簡單的做一些加密, 比如我們輸入"我是 007",就會變成一堆亂七八糟的字元在網上傳送,然後我們伺服器那邊只要用base64解密即可 。
我們依葫蘆畫瓢也在我們剛才的socket通訊例子上面加上加密部分decode_daya函式,然後傳送資料即可!
伺服器:
客服端:
看一下效果,我們的密碼變成一堆蝌蚪文:
Rec Welcome Client!
Send>>: b'Hi Server,I am 007!(16:39:17)'
networking: b'SGkgU2VydmVyLEkgYW0gMDA3ISgxNjozOToxNyk='
Rec <<: Hi,Client:Good Morning(16:39:17)
Send>>: b'My password is 1234!(16:39:20)'
networking: b'TXkgcGFzc3dvcmQgaXMgMTIzNCEoMTY6Mzk6MjAp'
Rec <<: Hi,Client:Welcome(16:39:20)
03.神級加密
上面的初級加密只能防禦一般的菜鳥,遇到高手, 要破解你的使用者名稱,密碼資訊還是比較輕鬆的, 對方只要也用base64解密一下即可!不要慌, Python裡面還有一個神級加密的庫pycrypto,這個是第三方庫,非常牛逼。
這個庫內容非常豐富,有很多加密的方法, 這裡我們用AES高階加密標準 。AES的區塊長度固定為128 位元,金鑰長度則可以是128,192或256位元(16、24和32位元組),我們用長度為16位元組的來示例一下:
也就是說,你在網路上傳送的資料是encrpy_data,即使×××截獲你了資料,如果它沒有金鑰是無法解密的!就算他要暴力破解也很難,因為是128位元的字元,而且是雙重金鑰,難度非常大!
看完之後是不是也想學Python呢,瞭解更多,視訊資料免費領取