前段時間的酒店信息泄露事情抑片,鬧的沸沸揚揚!確實我們很多的數(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比特的字符乳丰,而且是雙重密鑰掌测,難度非常大!
看完之后是不是也想學(xué)Python呢产园,了解更多汞斧,視頻資料免費領(lǐng)取