前段時間的酒店信息泄露事情,鬧的沸沸揚揚鸠匀!確實我們很多的數(shù)據(jù)在網(wǎng)絡(luò)上都是裸奔蕉斜,在數(shù)據(jù)庫里面躺著也都是明文數(shù)據(jù),連我自己的寫某某程序都被熱情的粉絲攻破缀棍!不如宅此,我們用萬能的Python寫段加密數(shù)據(jù)傳送玩玩,也許就能避免酒店數(shù)據(jù)泄漏了睦柴!
簡單的場景:
Server:Welcome
Client: Hi,I am 007 !
Server:Goog Monning 007.
Client: My password 1234!
Server:OK,Receiver your password.
上面是模擬簡單的CS場景,算是很典型的socket交互場景诽凌,里面的用戶名和密碼都是明文傳送的,相當(dāng)不安全坦敌,我們用代碼來演示一下侣诵。
01.模擬客戶端-服務(wù)端
Python里面的庫真的是非常多,只有你想不到狱窘《潘常基本上你想要做的大部分事情都有現(xiàn)成的輪子,不用自己造蘸炸,socket當(dāng)然也有躬络!
1).建立Server端
用socket模塊建立一個套接字對象server,綁定本地的ip和端口,端口要用冷門的端口!
2).響應(yīng)Client端的請求
服務(wù)端需要響應(yīng)客戶端的請求搭儒,我們從sock里面獲取數(shù)據(jù)穷当,然后再給client回應(yīng)一段echo消息.
我們用一個死循環(huán)來不斷的處理客戶端的請求消息提茁,這里為了簡單處理,我們不做任何的數(shù)據(jù)分析馁菜,只是接受client的數(shù)據(jù),然后從隨機應(yīng)答隊列里面茴扁,挑一條消息發(fā)給客戶端。(注意sock里面?zhèn)魉腿慷际莃yte類型,需要做str和byte的轉(zhuǎn)換)
3).響應(yīng)多個Client的請求
為了更多更快的處理客戶端的請求汪疮,我們這里用多線程來處理峭火,來一個請求,我們來一個線程.
4).創(chuàng)建Client端
也是建立socket對象智嚷,創(chuàng)建client端卖丸,然后綁定本地地址和端口。
5).客戶端發(fā)送數(shù)據(jù)給服務(wù)器
我們發(fā)送兩條數(shù)據(jù)給服務(wù)器盏道,一條是"我是007",一條是"我的密碼1234"稍浆。
好,經(jīng)過上面5步摇天,基本上一個簡單的socket通信代碼就出來了粹湃。整個代碼量不超過100行,我們簡單運行一個看看什么效果:
服務(wù)器:
客服端:
那么問題來了泉坐,我們的用戶名和密碼都是明文傳送的,有么有辦法加密呢裳仆,當(dāng)然有腕让,初級加密登場!
02.初級加密
上面的步驟完成了一個client/server的通信歧斟,但是我們的重要信息都是明文纯丸,完全暴露了,稍微用一個小爬蟲就能搞定你的數(shù)據(jù)静袖,這樣太不安全了觉鼻,我們用Python里面的base64模塊來加密一下,稍微偽裝一下:
>>紅色部分就是加密過的密文
raw msg: b'Hi,I am 007'
decode msg: b'SGksSSBhbSAwMDc='
restore msg: b'Hi,I am 007'
里面Python里面強大的base64這個模塊队橙,這個模塊是一種查表的編碼方式坠陈,可以簡單的做一些加密,比如我們輸入"我是 007"捐康,就會變成一堆亂七八糟的字符在網(wǎng)上傳送仇矾,然后我們服務(wù)器那邊只要用base64解密即可。
我們依葫蘆畫瓢也在我們剛才的socket通信例子上面加上加密部分decode_daya函數(shù)解总,然后傳送數(shù)據(jù)即可贮匕!
服務(wù)器:
客服端:
看一下效果,我們的密碼變成一堆蝌蚪文:
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,這個是第三方庫供屉,非常牛逼行冰。
這個庫內(nèi)容非常豐富,有很多加密的方法伶丐,這里我們用AES高級加密標(biāo)準(zhǔn)悼做。AES的區(qū)塊長度固定為128 比特,密鑰長度則可以是128哗魂,192或256比特(16肛走、24和32字節(jié)),我們用長度為16字節(jié)的來示例一下:
也就是說,你在網(wǎng)絡(luò)上傳送的數(shù)據(jù)是encrpy_data录别,即使黑客截獲你了數(shù)據(jù)朽色,如果它沒有密鑰是無法解密的!就算他要暴力破解也很難组题,因為是128比特的字符葫男,而且是雙重密鑰,難度非常大崔列!
好了梢褐,以后你有啥隱私數(shù)據(jù),或者存在數(shù)據(jù)庫里面的密碼也可以用密鑰加密存放赵讯!如果沒有key盈咳,除了你自己估計沒有人等解析出來,哈哈边翼!