Day15內(nèi)建模塊struct&hashlib&hmac

struct

Python提供了一個(gè)struct模塊來(lái)解決bytes和其他二進(jìn)制數(shù)據(jù)類型的轉(zhuǎn)換。
structpack函數(shù)把任意數(shù)據(jù)類型變成bytes

>>> bs = bytes([b1,b2,b3,b4])
>>> bs
b'\x00\x9c@c'

pack的第一個(gè)參數(shù)是處理指令,'>I'的意思是:
>表示字節(jié)順序是big-endian,也就是網(wǎng)絡(luò)序,I表示4字節(jié)無(wú)符號(hào)整數(shù)挂洛。
后面的參數(shù)個(gè)數(shù)要和處理指令一致。
unpackbytes變成相應(yīng)的數(shù)據(jù)類型:

>>> struct.unpack('>IH', b'\xf0\xf0\xf0\xf0\x80\x80')
(4042322160, 32896)

根據(jù)>IH的說(shuō)明,后面的bytes依次變?yōu)?code>I:4字節(jié)無(wú)符號(hào)整數(shù)和H:2字節(jié)無(wú)符號(hào)整數(shù)纵东。
所以,盡管Python不適合編寫(xiě)底層操作字節(jié)流的代碼啥寇,但在對(duì)性能要求不高的地方偎球,利用struct就方便多了洒扎。
struct模塊定義的數(shù)據(jù)類型可以參考Python官方文檔:
https://docs.python.org/3/library/struct.html#format-characters

BMP


hashlib

Python的hashlib提供了常見(jiàn)的摘要算法,如MD5衰絮,SHA1等等袍冷。
什么是摘要算法呢?摘要算法又稱哈希算法猫牡、散列算法胡诗。它通過(guò)一個(gè)函數(shù),把任意長(zhǎng)度的數(shù)據(jù)轉(zhuǎn)換為一個(gè)長(zhǎng)度固定的數(shù)據(jù)串(通常用16進(jìn)制的字符串表示)淌友。
摘要算法就是通過(guò)摘要函數(shù)f()對(duì)任意長(zhǎng)度的數(shù)據(jù)data計(jì)算出固定長(zhǎng)度的摘要digest煌恢,目的是為了發(fā)現(xiàn)原始數(shù)據(jù)是否被人篡改過(guò)。
摘要算法之所以能指出數(shù)據(jù)是否被篡改過(guò)震庭,就是因?yàn)檎瘮?shù)是一個(gè)單向函數(shù)瑰抵,計(jì)算f(data)很容易,但通過(guò)digest反推data卻非常困難器联。而且二汛,對(duì)原始數(shù)據(jù)做一個(gè)bit的修改,都會(huì)導(dǎo)致計(jì)算出的摘要完全不同拨拓。
以常見(jiàn)的摘要算法MD5為例肴颊,計(jì)算出一個(gè)字符串的MD5值:

>>> import hashlib
>>> md5 = hashlib.md5()
>>> md5.update('how to use md5 in python hashlib?'.encode('utf-8'))
>>> print(md5.hexdigest())
d26a53750bc40b38b65a520292f69306

如果數(shù)據(jù)量很大,可以分塊多次調(diào)用update()渣磷,最后計(jì)算的結(jié)果是一樣的:

import hashlib

md5 = hashlib.md5()
md5.update('how to use md5 in '.encode('utf-8'))
md5.update('python hashlib?'.encode('utf-8'))
print(md5.hexdigest())

MD5是最常見(jiàn)的摘要算法婿着,速度很快,生成結(jié)果是固定的128 bit字節(jié)幸海,通常用一個(gè)32位的16進(jìn)制字符串表示祟身。
另一種常見(jiàn)的摘要算法是SHA1,調(diào)用SHA1和調(diào)用MD5完全類似:

>>> import hashlib
>>> sha1 = hashlib.sha1()
>>> sha1.update('how to use sha1 in python hashlib?'.encode('utf-8'))
>>> print(sha1.hexdigest())
2c76b57293ce30acef38d98f6046927161b46a44

SHA1的結(jié)果是160 bit字節(jié)物独,通常用一個(gè)40位的16進(jìn)制字符串表示袜硫。
比SHA1更安全的算法是SHA256和SHA512,不過(guò)越安全的算法不僅越慢挡篓,而且摘要長(zhǎng)度更長(zhǎng)婉陷。

摘要算法應(yīng)用

摘要算法應(yīng)用

hmac

Python自帶的hmac模塊實(shí)現(xiàn)了標(biāo)準(zhǔn)的Hmac算法。我們來(lái)看看如何使用hmac實(shí)現(xiàn)帶key的哈希官研。
我們首先需要準(zhǔn)備待計(jì)算的原始消息message秽澳,隨機(jī)key,哈希算法戏羽,這里采用MD5担神,使用hmac的代碼如下:

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

可見(jiàn)使用hmac和普通hash算法非常類似始花。hmac輸出的長(zhǎng)度和原始哈希算法的長(zhǎng)度一致妄讯。需要注意傳入的key和message都是bytes類型孩锡,str類型需要首先編碼為bytes

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末亥贸,一起剝皮案震驚了整個(gè)濱河市躬窜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炕置,老刑警劉巖荣挨,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異朴摊,居然都是意外死亡默垄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)甚纲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)厕倍,“玉大人,你說(shuō)我怎么就攤上這事贩疙。” “怎么了况既?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵这溅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我棒仍,道長(zhǎng)悲靴,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任莫其,我火速辦了婚禮癞尚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乱陡。我一直安慰自己浇揩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布憨颠。 她就那樣靜靜地躺著胳徽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爽彤。 梳的紋絲不亂的頭發(fā)上养盗,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音适篙,去河邊找鬼往核。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嚷节,可吹牛的內(nèi)容都是我干的聂儒。 我是一名探鬼主播虎锚,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼薄货!你這毒婦竟也來(lái)了翁都?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谅猾,失蹤者是張志新(化名)和其女友劉穎柄慰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體税娜,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坐搔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敬矩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片概行。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖弧岳,靈堂內(nèi)的尸體忽然破棺而出凳忙,到底是詐尸還是另有隱情,我是刑警寧澤禽炬,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布涧卵,位于F島的核電站,受9級(jí)特大地震影響腹尖,放射性物質(zhì)發(fā)生泄漏柳恐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一热幔、第九天 我趴在偏房一處隱蔽的房頂上張望乐设。 院中可真熱鬧,春花似錦绎巨、人聲如沸近尚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肿男。三九已至,卻和暖如春却嗡,著一層夾襖步出監(jiān)牢的瞬間舶沛,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工窗价, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留如庭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像坪它,于是被迫代替她去往敵國(guó)和親骤竹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 本系列主要學(xué)習(xí)Python的基本使用和語(yǔ)法知識(shí)往毡,后續(xù)可能會(huì)圍繞著AI學(xué)習(xí)展開(kāi)蒙揣。Python3 (1) Python...
    猿來(lái)如癡閱讀 1,277評(píng)論 0 1
  • Base64是網(wǎng)絡(luò)上最常見(jiàn)的用于傳輸8Bit字節(jié)代碼的編碼方式之一,大家可以查看RFC2045~RFC2049开瞭,上...
    starfish33閱讀 232評(píng)論 0 0
  • python學(xué)習(xí)筆記 聲明:學(xué)習(xí)筆記主要是根據(jù)廖雪峰官方網(wǎng)站python學(xué)習(xí)學(xué)習(xí)的懒震,另外根據(jù)自己平時(shí)的積累進(jìn)行修正...
    renyangfar閱讀 3,050評(píng)論 0 10
  • 萬(wàn)里仰尊容,窺得千山第一雄嗤详,初去不知山多高个扰,攀了一重復(fù)一重,搖搖到峰巔葱色,望得山下霧蒙蒙递宅。萬(wàn)步險(xiǎn)阻終不負(fù),長(zhǎng)嘯聲聲云...
    周小丑閱讀 165評(píng)論 0 1
  • 2017.9.27周文娟(打卡35天) 【目標(biāo)】:完美伴侶(智慧苍狰,樣貌办龄,良好的經(jīng)濟(jì)條件) 【與目標(biāo)相關(guān)的種子】: ...
    柔光寶寶閱讀 118評(píng)論 0 0