<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
hashlib 模組中擁有很多的加密演演算法,我們並不需要關心加密演演算法的實現方法。只需要呼叫我們需要的加密函數,就可以幫助我們對資料進行加密。
它的加密演演算法有很多,不僅如此,hashlib 中很多加密演演算法加密難度很大,所以加密後的資料很難被破解(這裡的很難被破解是相對而言的,比如MD5、sha1、mysql、ntlm就可以在 cmd5 通過窮舉的方式進行明密文的對應查詢。),這就是 hashlib 強大的地方。既然無法破解也就無法解密,所以hashlib 中的加密方法都是不可逆的。
接下來就讓我們看一下 hashlib 中常用的加密演演算法:
函數名 | 引數 | 介紹 | 舉例 | 返回值 |
---|---|---|---|---|
md5 | byte | md5演演算法加密 | hashlib.md5(b’hello’) | hash物件 |
sha1 | byte | sha1演演算法加密 | hashlib.sha1(b’hello’) | hash物件 |
sha256 | byte | sha256演演算法加密 | hashlib.sha256(b’hello’) | hash物件 |
sha512 | byte | sha512演演算法加密 | hashlib.512(b’hello’) | hash物件 |
以上的加密函數都有一個 byte 型別的引數,通過呼叫對應的函數會返回一個 hash物件。所謂 hashlib 就是一種加密方式。
sha1、sha256、sha512 的區別就是 數值越高,被破解的概率就越低。
hashlib 模組生成加密字串範例:
import hashlib hashobj = hashlib.md5(b'Hello_World') # 將 'Hello_World'以 byte 形式傳入,通過 md5 加密 賦值給 hashobj 物件 result = hashobj.hexdigest() # hashobj 通過 hexdigest() 函數的16進位制生成加密字串賦值給 result print(result) # >>> 執行結果如下: # >>> 486b98e454e54f44e811b9c62857f8f7
大家可能有一個疑問, hashlib 模組加密後的無法解密獲取原始資料,那我們加密後的資訊有什麼用呢?實際上場景有很多,我們今天就來舉例一個場景。
比如我們的使用者需要某一個服務的幫助,使用者每次請求服務都需要一個憑證。這個憑證資訊是通過加密的方式生成的字串,並且該加密方式是雙方達成一致,標準相同的。當用戶請求該服務的時候,帶上這個加密的字串,服務會通過響應的加密規範也生成一個字串。如果使用者帶過來的憑證的字串與服務計算出來的憑證的字串完全一致,則證明使用者請求的這個服務是一個合法的請求,反之則不合法。
那麼定義這樣一個認證簽名字串就需要兩個資料和一個模組,模組就是 hashlib ,資料1就是 使用者與服務之間達成共識的一個基礎簽名 ,我們定義它為 bash_sign ;資料2我們可以使用 使用者請求服務生成憑證的時間戳,我們定義它為 user_timestamp 。
程式碼範例如下:
# coding:utf-8 import hashlib import time bash_sign = 'signature' # 定義一個基礎簽名變數 def user_request_client(): # TODO 使用者簽名 user_time = int(time.time()) # 獲取使用者請求服務生成憑證的時間戳 ;python 的時間戳是浮點型別,這裡轉成整型。 _token = '%s%s' % (bash_sign, user_time) # 定義一個加密之前的token,將 bash_sign 與 user_time 傳入 hashobj = hashlib.sha1(_token.encode('utf-8')) # 由於引數是 byte 型別,所以我們需要將 _token 進行編碼 user_token = hashobj.hexdigest() # 將 bash_sign 與 user_time 通過 sha1 加密的字串 賦值給 user_token return user_token, user_time def service_check_token(token, user_timestamp): # TODO 伺服器校驗簽名 _token = '%s%s' % (bash_sign, user_timestamp) # 伺服器接收使用者請求傳入的 token 與 時間戳 service_token = hashlib.sha1(_token.encode('utf-8')).hexdigest() # 伺服器的 token ,加密方式與使用者請求加密方式一致 if token == service_token: # 校驗加密串的合法性,若校驗不通過,拒絕使用者的服務請求 # print(token, '---', user_timestamp) return True else: return False if __name__ == '__main__': need_help_token, timestamp = user_request_client() # time.sleep(1) # 取消註釋後,時間錯不一致則會 簽名校驗不通過 # result = service_check_token(need_help_token, time.time()) result = service_check_token(need_help_token, timestamp) if result == True: print('使用者請求服務簽名校驗通過,伺服器提供對應服務') else: print('使用者請求服務簽名校驗未通過,伺服器拒絕提供對應服務') # >>> 執行結果如下: # >>> 使用者請求服務簽名校驗通過,伺服器提供對應服務
所以這一種驗證需要兩個方面,第一個就是我們生成傳入的 token 以及 時間戳,第二個就是 token 是否是按照我們定義好的標準生成的;
這兩個不管是那一個出錯了,伺服器校驗簽名都是不通過。這也是 hashlib 模組 常用的場景之一,大家也可以嘗試拓展一下思維,還有哪些場景適用於這種不可逆的演演算法。
base64 加密模組也是一種通用型的加密演演算法,與之前我們講的 json 模組一樣,在很多程式語言中都有 base64模組且功能基本相同。 所以在任何程式語言中,都可以將base64加密的字串進行解密。
既然都可以進行解密,那麼帶來的問題就是沒有安全可言了。其實不然,我們自然有辦法去解決。稍後我們通過一個小練習來解決這個問題。
函數名 | 引數 | 介紹 | 舉例 | 返回值 |
---|---|---|---|---|
encodestring | byte | 進行base64加密 | base64.encodestring(b’string’) | byte |
decodestring | byte | 進行base64解密 | base64.decodestring(b’c3RyaW5nn’) | byte |
encodebytes | byte | 進行base64加密 | base64.encodebytes(b’string’) | byte |
decodebytes | byte | 進行base64解密 | base64.decodebytes(b’c3RyaW5nn’) | byte |
注意:encodestring()函數 與 decodestring() 函數 雖然從名字上來看是對 字串 進行 加密解密,但是在用法上需要對字串進行 byte 型別的轉換,然後再執行對應的加密解密操作。
encodebytes()函數 與 decodebytes() 函數 功能、引數、返回值 與字串加解密一致,實際上在 python3.x 中,官方更推薦使用著一組函數進行加密和解密。
接下來我們看一下 base64 模組的 加解密演示那裡:
注意:由於無論如何我們都需要通過 byte 型別進行資料的加密與解密,所以我們可以對加密、解密進行一個封裝。
# coding:utf-8 import base64 def encode(data): # 編碼函數 if isinstance(data, str): # 判斷傳入的 data 的資料型別 data = data.encode('utf-8') elif isinstance(data, bytes): data = data else: raise TypeError('傳輸的 'data' 引數需為 bytes 或 str 型別') # print(base64.encodebytes(data)) # print(base64.encodebytes(data).decode('utf-8')) return base64.encodebytes(data).decode('utf-8') # 加密後的 data 格式為byte型別,需要進行解碼為字串,參考上兩行程式碼 def decone(data): if not isinstance(data, bytes): raise TypeError('傳輸的 'data' 引數需為 bytes 型別') return base64.decodebytes(data).decode('utf-8') if __name__ == '__main__': result = encode('signature') print('base64 編碼後的結果為:', result) new_result = decone(result.encode('utf-8')) print('base64 解碼後的結果為:', new_result) # >>> 執行結果如下: # >>> base64 編碼後的結果為: c2lnbmF0dXJl # >>> base64 解碼後的結果為: signature
但是就像上文我們提及的一樣,既然所有人都知道 base64 的加密方式與解密方式,那我們該如何是好呢?其實也很簡單,那就是對我們的 base64 加密的密文進行字串替換的二次輸出。(所謂的二次輸出,其實就是二次轉換的過程。)
比如我們定義三個字串專門用作加密後的某個字元的替換,程式碼範例如下:
# coding:utf-8 import base64 replace_one = '$' replace_two = '%' replace_three = '=' def encode(data): # 編碼函數 if isinstance(data, str): # 判斷傳入的 data 的資料型別 data = data.encode('utf-8') elif isinstance(data, bytes): data = data else: raise TypeError('傳輸的 'data' 引數需為 bytes 或 str 型別') # print(base64.encodebytes(data)) # print(base64.encodebytes(data).decode('utf-8')) _data = base64.encodebytes(data).decode('utf-8') # 加密後的 data 格式為byte型別,需要進行解碼為字串,參考上兩行程式碼 _data = _data.replace('c', replace_one).replace('2', replace_two).replace('l', replace_three) # 替換 'c'、'2'、'l' return _data def decone(data): if not isinstance(data, bytes): raise TypeError('傳輸的 'data' 引數需為 bytes 型別') return base64.decodebytes(data).decode('utf-8') if __name__ == '__main__': result = encode('signature') print('base64 編碼後的結果為:', result) new_result = decone(result.encode('utf-8')) print('base64 解碼後的結果為:', new_result)
執行結果如下:
既然加密進行了二次轉換,那麼解密的時候同樣需要進行二次轉換才行,所以我們需要重構一下 decone() 函數。
def decone(data): if not isinstance(data, bytes): raise TypeError('傳輸的 'data' 引數需為 bytes 型別') replace_one_decone = replace_one.encode('utf-8') # 需要將二次轉換的變數已 byte 的形式進行解碼 replace_two_decone = replace_two.encode('utf-8') replace_three_decone = replace_three.encode('utf-8') data = data.replace(replace_one_decone, b'c').replace(replace_two_decone, b'2').replace(replace_three_decone, b'l') return base64.decodebytes(data).decode('utf-8')
執行結果如下:
小節:通過這種方法,只有具體的開發人員與使用的業務人員才知道這種二次替換的方式,需要通過那些字元進行加密或者解密。從而提高了資料傳輸的安全性。
到此這篇關於Python學習之加密模組使用詳解的文章就介紹到這了,更多相關Python加密模組內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45