base64
import base64 # Base64是一種用64個字符來表示任意二進制數據的方法。常用於在URL、Cookie、網頁中傳輸少量二進制數據。
encode_val = base64.b64encode('test ak47'.encode()) # 將bytes類型轉換成base64類型 返回一個bytes類型
decode_val = base64.b64decode(encode_val) # 將得到的值進行解碼 可以是字符串類型
print(encode_val, type(encode_val), decode_val.decode())
hmac
import hmac # hmac模塊實現了標準的Hmac算法。
def test_md5_hmac():
msg = 'test'.encode() # 將傳入的參數轉成bytes類型
key = 'mykey'.encode() # 將key轉成bytes類型 這個過程也成加鹽
# hm = hmac.new(key, msg, digestmod='MD5') # 使用md5的方法計算
# return hm.hexdigest()
hm = hmac.new(key) # 加鹽操作
hm.update(msg) # 類似hashlib 計算數據
return hm.hexdigest()
if __name__ == "__main__":
pass_md5 = test_md5_hmac()
print(pass_md5, type(pass_md5), len(pass_md5))
hashlib
import hashlib # hashlib提供了常見的摘要算法:摘要算法又稱哈希算法、散列算法。它通過一個函數,把任意長度的數據轉換爲一個長度固定的數據串(通常用16進制的字符串表示)。
'''
摘要算法就是通過摘要函數f()對任意長度的數據data計算出固定長度的摘要digest,目的是爲了發現原始數據是否被人篡改過。
舉個例子,你寫了一篇文章,內容是一個字符串'how to use python hashlib - by Michael',並附上這篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。
如果有人篡改了你的文章,並發表爲'how to use python hashlib - by Bob',你可以一下子指出Bob篡改了你的文章,因爲根據'how to use python hashlib - by Bob'計算出的摘要不同於原始文章的摘要。
摘要算法之所以能指出數據是否被篡改過,就是因爲摘要函數是一個單向函數,計算f(data)很容易,但通過digest反推data卻非常困難。而且,對原始數據做一個bit的修改,都會導致計算出的摘要完全不同。
'''
def test_sha256(password):
# 利用sha256生成密碼
h = hashlib.sha256() # 創建一個實例
# h.update(password.encode('utf-8')) # 開始處理數據,接受一個bytes類型的值
# 對數據進行加鹽處理,爲什麼要這樣做,對呀密碼進行加密的時候 可能會出現使用123456 111111 password等簡單密碼,因爲算法生成得到的值永遠是一樣的
# 所以有可能會被有心人士輕鬆的對比出來,所以我們進行加鹽操作後,只有對方不知道我們加的值是什麼,那麼對方就無法得到加密數據的明文值
h.update((password + '-mykey').encode('utf-8'))
# h_result = h.hexdigest() # 得出計算結果 返回一個16進制字符串
h_result = h.digest() # 得出計算結果 返回一個bytes類型
return h_result
def test_md5():
# 利用md5生成密碼
h = hashlib.md5()
# 當需要計算的數據過大時 可以拆分計算 得到的結果任然是一樣的
h.update('1234'.encode('utf-8'))
h.update('56'.encode('utf-8'))
h_result = h.hexdigest()
return h_result
if __name__ == "__main__":
pass_sha256 = test_sha256('123456')
pass_md5 = test_md5()
print(pass_sha256, type(pass_sha256), len(pass_sha256))
print(pass_md5, type(pass_md5), len(pass_md5))
# print(dir(hashlib))
import chardet
# 使用 chardet 猜測bytes的編碼
print(chardet.detect(pass_sha256))