Python学习笔记:常用内建模块4:hmac
前言
最近在學習深度學習,已經跑出了幾個模型,但Pyhton的基礎不夠扎實,因此,開始補習Python了,大家都推薦廖雪峰的課程,因此,開始了學習,但光學有沒有用,還要和大家討論一下,因此,寫下這些帖子,廖雪峰的課程連接在這里:廖雪峰
Python的相關介紹,以及它的歷史故事和運行機制,可以參見這篇:python介紹
Python的安裝可以參見這篇:Python安裝
Python的運行模式以及輸入輸出可以參見這篇:Python IO
Python的基礎概念介紹,可以參見這篇:Python 基礎
Python字符串和編碼的介紹,可以參見這篇:Python字符串與編碼
Python基本數據結構:list和tuple介紹,可以參見這篇:Python list和tuple
Python控制語句介紹:ifelse,可以參見這篇:Python 條件判斷
Python控制語句介紹:循環實現,可以參見這篇:Python循環語句
Python數據結構:dict和set介紹Python數據結構dict和set
Python函數相關:Python函數
Python高階特性:Python高級特性
Python高階函數:Python高階函數
Python匿名函數:Python匿名函數
Python裝飾器:Python裝飾器
Python偏函數:Python偏函數
Python模塊:Python模塊
Python面向對象編程(1):Python面向對象
Python面向對象編程(2):Python面向對象(2)
Python面向對象編程(3):Python面向對象(3)
Python面向對象編程(4):Pyhton面向對象(4)
Python面向對象高級編程(上):Python面向對象高級編程(上)
Python面向對象高級編程(中上):Python面向對象高級編程(中上)
Python面向對象高級編程(中下):Python面向對象高級編程(中下)
Python面向對象高級編程(完):Python面向對象高級編程(完)
Python錯誤調試(起):Python調試:起
Python錯誤調試(承):Python調試:承
Python錯誤調試(轉):Python調試:轉
Python錯誤調試(合):python調試:合
Python文件IO編程:Python文件IO
Python文件IO編程2:Python文件IO2
Python文件IO編程3:PYthon文件IO3
Python進程和線程(起):Python進程和線程起
Python進程和線程(承):Python進程和線程承
Python進程和線程(轉):Python進程和線程轉
Python進程和線程(合):Python進程和線程合
Python正則表達式:Python正則表達式
Python學習筆記:常用內建模塊1:Python學習筆記:常用內建模塊1
Python學習筆記:常用內建模塊2:Python學習筆記:常用內建模塊2
Python學習筆記:常用內建模塊3:Python學習筆記:常用內建模塊3
目錄
- 前言
- 目錄
- hmac
- 小結
- itertools
- cycle()
- repeat()
- chain()
- groupby()
- 小結
hmac
通過哈希算法,我們可以驗證一段數據是否有效,方法就是對比該數據的哈希值,例如,判斷用戶口令是否正確,我們用保存在數據庫中的password_md5對比計算md5(password)的結果,如果一致,用戶輸入的口令就是正確的。
為了防止黑客通過彩虹表根據哈希值反推原始口令,在計算哈希的時候,不能僅針對原始輸入計算,需要增加一個salt來使得相同的輸入也能得到不同的哈希,這樣,大大增加了黑客破解的難度。
如果salt是我們自己隨機生成的,通常我們計算MD5時采用md5(message + salt)。但實際上,把salt看做一個“口令”,加salt的哈希就是:計算一段message的哈希時,根據不通口令計算出不同的哈希。要驗證哈希值,必須同時提供正確的口令。
這實際上就是Hmac算法:Keyed-Hashing for Message Authentication。它通過一個標準算法,在計算哈希的過程中,把key混入計算過程中。
和我們自定義的加salt算法不同,Hmac算法針對所有哈希算法都通用,無論是MD5還是SHA-1。采用Hmac替代我們自己的salt算法,可以使程序算法更標準化,也更安全。
Python自帶的hmac模塊實現了標準的Hmac算法。我們來看看如何使用hmac實現帶key的哈希。
我們首先需要準備待計算的原始消息message,隨機key,哈希算法,這里采用MD5,使用hmac的代碼如下:
>>> import hmac >>> message = b'Hello, world!' >>> key = b'secret' >>> h = hmac.new(key, message, digestmod='MD5') >>> # 如果消息很長,可以多次調用h.update(msg) >>> h.hexdigest() 'fa4ee7d173f2d97ee79022d1a7355bcf'可見使用hmac和普通hash算法非常類似。hmac輸出的長度和原始哈希算法的長度一致。需要注意傳入的key和message都是bytes類型,str類型需要首先編碼為bytes。
小結
Python內置的hmac模塊實現了標準的Hmac算法,它利用一個key對message計算“雜湊”后的hash,使用hmac算法比標準hash算法更安全,因為針對相同的message,不同的key會產生不同的hash。
itertools
Python的內建模塊itertools提供了非常有用的用于操作迭代對象的函數。
首先,我們看看itertools提供的幾個“無限”迭代器:
>>> import itertools >>> natuals = itertools.count(1) >>> for n in natuals: ... print(n) ... 1 2 3 ...因為count()會創建一個無限的迭代器,所以上述代碼會打印出自然數序列,根本停不下來,只能按Ctrl+C退出。
cycle()
cycle()會把傳入的一個序列無限重復下去:
>>> import itertools >>> cs = itertools.cycle('ABC') # 注意字符串也是序列的一種 >>> for c in cs: ... print(c) ... 'A' 'B' 'C' 'A' 'B' 'C' ...同樣停不下來。
repeat()
repeat()負責把一個元素無限重復下去,不過如果提供第二個參數就可以限定重復次數:
>>> ns = itertools.repeat('A', 3) >>> for n in ns: ... print(n) ... A A A無限序列只有在for迭代時才會無限地迭代下去,如果只是創建了一個迭代對象,它不會事先把無限個元素生成出來,事實上也不可能在內存中創建無限多個元素。
無限序列雖然可以無限迭代下去,但是通常我們會通過takewhile()等函數根據條件判斷來截取出一個有限的序列:
>>> natuals = itertools.count(1) >>> ns = itertools.takewhile(lambda x: x <= 10, natuals) >>> list(ns) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]itertools提供的幾個迭代器操作函數更加有用:chain()
chain()可以把一組迭代對象串聯起來,形成一個更大的迭代器:
>>> for c in itertools.chain('ABC', 'XYZ'): ... print(c) # 迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'groupby()
groupby()把迭代器中相鄰的重復元素挑出來放在一起:
>>> for key, group in itertools.groupby('AAABBBCCAAA'): ... print(key, list(group)) ... A ['A', 'A', 'A'] B ['B', 'B', 'B'] C ['C', 'C'] A ['A', 'A', 'A']實際上挑選規則是通過函數完成的,只要作用于函數的兩個元素返回的值相等,這兩個元素就被認為是在一組的,而函數返回值作為組的key。如果我們要忽略大小寫分組,就可以讓元素’A’和’a’都返回相同的key:
>>> for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()): ... print(key, list(group)) ... A ['A', 'a', 'a'] B ['B', 'B', 'b'] C ['c', 'C'] A ['A', 'A', 'a']大小寫不影響的驗證碼。
小結
itertools模塊提供的全部是處理迭代功能的函數,它們的返回值不是list,而是Iterator,只有用for循環迭代的時候才真正計算。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Python学习笔记:常用内建模块4:hmac的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python学习笔记:常用内建模块3:s
- 下一篇: java算法提高求最大值_藍橋杯 算法提