日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python学习笔记:常用内建模块4:hmac

發(fā)布時間:2025/3/15 python 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python学习笔记:常用内建模块4:hmac 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

最近在學習深度學習,已經(jīng)跑出了幾個模型,但Pyhton的基礎不夠扎實,因此,開始補習Python了,大家都推薦廖雪峰的課程,因此,開始了學習,但光學有沒有用,還要和大家討論一下,因此,寫下這些帖子,廖雪峰的課程連接在這里:廖雪峰
Python的相關介紹,以及它的歷史故事和運行機制,可以參見這篇:python介紹
Python的安裝可以參見這篇:Python安裝
Python的運行模式以及輸入輸出可以參見這篇:Python IO
Python的基礎概念介紹,可以參見這篇:Python 基礎
Python字符串和編碼的介紹,可以參見這篇:Python字符串與編碼
Python基本數(shù)據(jù)結(jié)構:list和tuple介紹,可以參見這篇:Python list和tuple
Python控制語句介紹:ifelse,可以參見這篇:Python 條件判斷
Python控制語句介紹:循環(huán)實現(xiàn),可以參見這篇:Python循環(huán)語句
Python數(shù)據(jù)結(jié)構:dict和set介紹Python數(shù)據(jù)結(jié)構dict和set
Python函數(shù)相關:Python函數(shù)
Python高階特性:Python高級特性
Python高階函數(shù):Python高階函數(shù)
Python匿名函數(shù):Python匿名函數(shù)
Python裝飾器:Python裝飾器
Python偏函數(shù):Python偏函數(shù)
Python模塊:Python模塊
Python面向?qū)ο缶幊?#xff08;1):Python面向?qū)ο?
Python面向?qū)ο缶幊?#xff08;2):Python面向?qū)ο?#xff08;2)
Python面向?qū)ο缶幊?#xff08;3):Python面向?qū)ο?#xff08;3)
Python面向?qū)ο缶幊?#xff08;4):Pyhton面向?qū)ο?#xff08;4)
Python面向?qū)ο蟾呒壘幊?#xff08;上):Python面向?qū)ο蟾呒壘幊?#xff08;上)
Python面向?qū)ο蟾呒壘幊?#xff08;中上):Python面向?qū)ο蟾呒壘幊?#xff08;中上)
Python面向?qū)ο蟾呒壘幊?#xff08;中下):Python面向?qū)ο蟾呒壘幊?#xff08;中下)
Python面向?qū)ο蟾呒壘幊?#xff08;完):Python面向?qū)ο蟾呒壘幊?#xff08;完)
Python錯誤調(diào)試(起):Python調(diào)試:起
Python錯誤調(diào)試(承):Python調(diào)試:承
Python錯誤調(diào)試(轉(zhuǎn)):Python調(diào)試:轉(zhuǎn)
Python錯誤調(diào)試(合):python調(diào)試:合
Python文件IO編程:Python文件IO
Python文件IO編程2:Python文件IO2
Python文件IO編程3:PYthon文件IO3
Python進程和線程(起):Python進程和線程起
Python進程和線程(承):Python進程和線程承
Python進程和線程(轉(zhuǎn)):Python進程和線程轉(zhuǎn)
Python進程和線程(合):Python進程和線程合
Python正則表達式:Python正則表達式
Python學習筆記:常用內(nèi)建模塊1:Python學習筆記:常用內(nèi)建模塊1
Python學習筆記:常用內(nèi)建模塊2:Python學習筆記:常用內(nèi)建模塊2
Python學習筆記:常用內(nèi)建模塊3:Python學習筆記:常用內(nèi)建模塊3

目錄

  • 前言
  • 目錄
  • hmac
    • 小結(jié)
  • itertools
    • cycle()
    • repeat()
    • chain()
    • groupby()
    • 小結(jié)

hmac

通過哈希算法,我們可以驗證一段數(shù)據(jù)是否有效,方法就是對比該數(shù)據(jù)的哈希值,例如,判斷用戶口令是否正確,我們用保存在數(shù)據(jù)庫中的password_md5對比計算md5(password)的結(jié)果,如果一致,用戶輸入的口令就是正確的。

為了防止黑客通過彩虹表根據(jù)哈希值反推原始口令,在計算哈希的時候,不能僅針對原始輸入計算,需要增加一個salt來使得相同的輸入也能得到不同的哈希,這樣,大大增加了黑客破解的難度。

如果salt是我們自己隨機生成的,通常我們計算MD5時采用md5(message + salt)。但實際上,把salt看做一個“口令”,加salt的哈希就是:計算一段message的哈希時,根據(jù)不通口令計算出不同的哈希。要驗證哈希值,必須同時提供正確的口令。

這實際上就是Hmac算法:Keyed-Hashing for Message Authentication。它通過一個標準算法,在計算哈希的過程中,把key混入計算過程中。

和我們自定義的加salt算法不同,Hmac算法針對所有哈希算法都通用,無論是MD5還是SHA-1。采用Hmac替代我們自己的salt算法,可以使程序算法更標準化,也更安全。

Python自帶的hmac模塊實現(xiàn)了標準的Hmac算法。我們來看看如何使用hmac實現(xiàn)帶key的哈希。

我們首先需要準備待計算的原始消息message,隨機key,哈希算法,這里采用MD5,使用hmac的代碼如下:

>>> import hmac >>> message = b'Hello, world!' >>> key = b'secret' >>> h = hmac.new(key, message, digestmod='MD5') >>> # 如果消息很長,可以多次調(diào)用h.update(msg) >>> h.hexdigest() 'fa4ee7d173f2d97ee79022d1a7355bcf'

可見使用hmac和普通hash算法非常類似。hmac輸出的長度和原始哈希算法的長度一致。需要注意傳入的key和message都是bytes類型,str類型需要首先編碼為bytes

小結(jié)

Python內(nèi)置的hmac模塊實現(xiàn)了標準的Hmac算法,它利用一個key對message計算“雜湊”后的hash,使用hmac算法比標準hash算法更安全,因為針對相同的message,不同的key會產(chǎn)生不同的hash。

itertools

Python的內(nèi)建模塊itertools提供了非常有用的用于操作迭代對象的函數(shù)。

首先,我們看看itertools提供的幾個“無限”迭代器:

>>> import itertools >>> natuals = itertools.count(1) >>> for n in natuals: ... print(n) ... 1 2 3 ...

因為count()會創(chuàng)建一個無限的迭代器,所以上述代碼會打印出自然數(shù)序列,根本停不下來,只能按Ctrl+C退出。

cycle()

cycle()會把傳入的一個序列無限重復下去:

>>> import itertools >>> cs = itertools.cycle('ABC') # 注意字符串也是序列的一種 >>> for c in cs: ... print(c) ... 'A' 'B' 'C' 'A' 'B' 'C' ...

同樣停不下來。

repeat()

repeat()負責把一個元素無限重復下去,不過如果提供第二個參數(shù)就可以限定重復次數(shù):

>>> ns = itertools.repeat('A', 3) >>> for n in ns: ... print(n) ... A A A

無限序列只有在for迭代時才會無限地迭代下去,如果只是創(chuàng)建了一個迭代對象,它不會事先把無限個元素生成出來,事實上也不可能在內(nèi)存中創(chuàng)建無限多個元素。

無限序列雖然可以無限迭代下去,但是通常我們會通過takewhile()等函數(shù)根據(jù)條件判斷來截取出一個有限的序列:

>>> 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提供的幾個迭代器操作函數(shù)更加有用:

chain()

chain()可以把一組迭代對象串聯(lián)起來,形成一個更大的迭代器:

>>> 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']

實際上挑選規(guī)則是通過函數(shù)完成的,只要作用于函數(shù)的兩個元素返回的值相等,這兩個元素就被認為是在一組的,而函數(shù)返回值作為組的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']

大小寫不影響的驗證碼。

小結(jié)

itertools模塊提供的全部是處理迭代功能的函數(shù),它們的返回值不是list,而是Iterator,只有用for循環(huán)迭代的時候才真正計算。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結(jié)

以上是生活随笔為你收集整理的Python学习笔记:常用内建模块4:hmac的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。