這篇文章主要介紹了Python加密模塊的hashlib,hmac模塊使用解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
在寫搬磚腳本中,碰到一個加密的信號標簽文件無法運行。
import hashlib
import time
m = hashlib.md5()
api_key = ""
api_secret = ""
params = {"api_key":api_key, "time":int(time.time()), "symbol":"btclcny"}
def sign( data , secret ):
signStr = ""
keys = data.keys()
keys = sorted(keys)
for key in keys:
signStr = signStr + key
signStr = signStr + bytes(data[key])
pass
signStr += secret
m.update(signStr)
return m.hexdigest()
print sign( params , api_secret )
實在搞不懂寫的人的意思,里面有字符串與字節碼的相加?反正就是跑不起來,隨便我這個加密模塊也用的少,這次就給自己記錄學習的機會來了。
媽的,這個平臺太垃圾了,接口有問題的,浪費我好長時間,后面還去看了它的PHP代碼,看的腦子發麻,后來仔細研究了傳入 params,里面的接口文檔寫的亂七八糟,浪費時間。一萬頭草泥馬飛過。
切入主題,先講hashlib,后面介紹hmac,有時間下一個章節,把base64還有io,以及pickle,json,shelve,fileinput.
概念:
Python的hashlib提供了常見的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?摘要算法又稱哈希算法、散列算法。它通過一個函數,把任意長度的數據轉換為一個長度固定的數據串(通常用16進制的字符串表示)。所以看來的hash加密值沒有超過字母f的
后面可以測試每種加密手法的輸出字段長度,也可以知道具體輸出的Byte字節數(一個16進制的數對應4位)。
"""初始化對象"""
h1 = hashlib.md5()
h2 = hashlib.new("md5")
h3 = hashlib.md5()
h1.update(b"123") # 進行摘要
h2.update("123".encode())
h3.update(b"1")
h3.update(b"23")
print(h1.hexdigest()) # 取值
print(h2.hexdigest())
print(h3.hexdigest())
202cb962ac59075b964b07152d234b70
202cb962ac59075b964b07152d234b70
202cb962ac59075b964b07152d234b70
一共有兩種實例化的方法,一般介紹都是第一種。記住,進行進行md5摘要時,對象一定是二進制數據。
update其實可以分開用,只要里面的數據沒有變,分開用書上介紹對大文件操作會更加快。
由于這樣直接加密,沒有添加輔助字符,假如是用戶的密碼設置的很簡單,很容易通過加密后的數據也能反向分析出密碼,所以要添加一些干擾詞匯。
hmac也是干擾加密的另外一種相對看過去比較高級的寫法。
add_word = b"haha" # 把這個當做加密鹽,
hh1 = hashlib.md5()
hh1.update(add_word + b"jiujiu")
print(hh1.hexdigest())
hh2 = hashlib.md5()
hh2.update( b"jiujiu" + add_word)
print(hh2.hexdigest())
m = hmac.new(add_word) # 這個跟hashlib的寫法有點類似,默認是md5加密
m.update(b"jiujiu")
print(m.hexdigest())
h_md5 = hmac.new(add_word, b"jiujiu").hexdigest() # 這是另外一種方式,直接加密后取值。
h_sha1 = hmac.new(add_word, b"jiujiu", "sha1").hexdigest()
h_sha224 = hmac.new(add_word, b"jiujiu", "sha224").hexdigest()
h_sha256 = hmac.new(add_word, b"jiujiu", "sha256").hexdigest()
h_sha512 = hmac.new(add_word, b"jiujiu", "sha512").hexdigest()
print(h_md5, len(h_md5), sep="======>num")
print(h_sha1, len(h_sha1), sep="======>num") # 通過輸出可以看出,md5輸出32個16進制數字,一共128位
print(h_sha224, len(h_sha224), sep="======>num") # sha1輸出40個數字,所以為160位,剩下的sha后面的數字就代表輸出幾位。
print(h_sha256, len(h_sha256), sep="======>num")
print(h_sha512, len(h_sha512), sep="======>num")
3e289c523f955430bce2e47a14d4934b
eb01e09a1fe2bfd95d8f31c8ae544faf
ef84bc9ee2bf91d1789227d82193d7a9
ef84bc9ee2bf91d1789227d82193d7a9======>num32
fbd95ddafdac6352cdf3d9d4e8c6d2421c80e56c======>num40
60d1896d00e73bc67469a58b39ded91c60c162eda0f44306f7d08d58======>num56
b36f8977bba6265612bc338b89c698d17cff7ccfb81b7d7a434f0ad889995e26======>num64
043f51bd410f9d328ca0ab0913ddfde9c2519f639c74447a1516811b8920b125aa6f4d3977c83e038e82c39103ac2a3bbdd5235c9c95fc030a267cdf0d578696======>num128
從整個代碼的操作來看還是比較簡單,至少比我想象的簡單,加密的邏輯我也不懂,我也知道密碼學很高級,就我這小學三年級的數學有空再看吧。
hmac只不過是一種機器加密的手段,但我試過了,無論我把這個加密鹽放加密字節碼的前面或者后面,跟hmac出來的效果不一樣,看來它有自己的拼接加密算法。
至于sha1,sha256,sha512就比較容易記住了,md5是32個16進制數輸出,所以包含bit是128位,sha1是是輸出40個16進制數,所以是160個bit,剩下的比較好理解,后面的數字代表了幾個bit位。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持云海天教程。