欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python 密碼學(xué)示例——理解哈希(Hash)算法

 更新時(shí)間:2020年09月21日 09:05:44   作者:Starryland  
這篇文章主要介紹了哈希(Hash)算法的相關(guān)資料,幫助大家更好的利用python處理密碼,感興趣的朋友可以了解下

Hash 是密碼學(xué)安全性的基石,它引入了單向函數(shù)(one-way function)和指紋(fingerprint)的概念。即:

  • 對(duì)于任意輸入,都可以產(chǎn)生相同的、唯一的輸出值
  • 輸出值中不包含輸入值的任何線索

一、保密性(confidentiality)與完整性(integrity)

簡(jiǎn)單來說,信息的保密性確保除授權(quán)人員以外的任何人都無法讀取該消息,信息的完整性則確保除授權(quán)人員以外的任何人都無法修改該消息。
很多時(shí)候一段加密的消息無法被他人讀取和理解(保密性),并不意味著該密文不會(huì)在傳播過程中被截取和惡意修改(完整性)。

信息摘要(message digest)或指紋(fingerprint)技術(shù)即用于驗(yàn)證信息的完整性。

信息摘要需滿足的基本條件為:

  • 相同的文檔永遠(yuǎn)會(huì)生成相同的摘要(能夠作為身份線索)
  • 生成的摘要“感覺”是隨機(jī)的,即摘要中不包含原始文檔的任何信息(無法被破解)

信息摘要也被稱作指紋,即可以代表某份文檔“身份”的一小段數(shù)據(jù),類似于人類的指紋。
每個(gè)人都可以通過指紋驗(yàn)證其身份,但該指紋并不包含其身體的所有信息。文檔的指紋也是如此,可以很方便快速的通過文檔內(nèi)容計(jì)算得出一小段唯一的指紋數(shù)據(jù)作為其身份證明,但是只有指紋數(shù)據(jù)就幾乎不可能得出原始文檔的內(nèi)容。

對(duì)于兩份文檔,只需要比對(duì)其信息摘要(指紋)是否一致,就可以確保其內(nèi)容是否相同,在傳播過程中是否被人惡意修改。同時(shí)該指紋信息也不會(huì)造成原始文檔本內(nèi)容的泄露。

二、MD5

MD5 是一種比較古老的哈希算法,其名字中的 MD 即代表 message digest。它可以從任意大小的文檔計(jì)算出一個(gè)唯一的 16 字節(jié)長(zhǎng)度的摘要數(shù)據(jù)。

PS:鑒于 MD5 較悠久的歷史和不夠長(zhǎng)的摘要長(zhǎng)度,不推薦在安全性很敏感的場(chǎng)景中使用該算法。

>>> from hashlib import md5
>>> md5(b'alice').hexdigest()
'6384e2b2184bcbf58eccf10ca7a6563c'
>>> md5(b'bob').hexdigest()
'9f9d51bc70ef21ca5c14f307980a29d8'
>>> md5(b'balice').hexdigest()
'6760742ebf884c998752b4e082b78224'
>>> md5(b'cob').hexdigest()
'386685f06beecb9f35db2e22da429ec9'
>>> md5(b'a').hexdigest()
'0cc175b9c0f1b6a831c399e269772661'
>>> md5(b'aa').hexdigest()
'4124bc0a9335c27f086f24ba207a4912'
>>> md5(b'aa' * 100000).hexdigest()
'561b1994f6baacd6e5eaf4baaa12849f'
>>> md5(b'alice').hexdigest()
'6384e2b2184bcbf58eccf10ca7a6563c'

從輸出中可以看出,針對(duì)不同的輸入內(nèi)容(即便相似度很高,比如 bob 和 cob),摘要算法生成的輸出是發(fā)散的,彼此之間沒有相似性,像是隨機(jī)生成的結(jié)果。
但是對(duì)于任意相同的輸入,生成的摘要數(shù)據(jù)則都是確定的、唯一的。

三、哈希算法的規(guī)則

一般我們提到哈希算法,都會(huì)關(guān)聯(lián)到密碼學(xué)、安全性等場(chǎng)景中,實(shí)際上我們很早就接觸了一種完全“非密碼學(xué)”的哈希場(chǎng)景。比如小時(shí)候跟老師學(xué)習(xí)判斷一個(gè)數(shù)是奇數(shù)還是偶數(shù)。。。
從本質(zhì)上看,哈希函數(shù)的目的是將巨大(甚至無窮大)數(shù)量的事物映射到一個(gè)相對(duì)較小的數(shù)據(jù)集中。比如 MD5,不管輸入的文檔有多大,最終都會(huì)生成一個(gè)固定長(zhǎng)度(16 字節(jié))的十六進(jìn)制數(shù)字作為指紋。
這就意味著 MD5 的輸入集合,實(shí)際上是大于其輸出集合的。即只要輸入文檔的集合足夠大(很大很大),就有可能出現(xiàn)重復(fù)的指紋信息。

這和判斷數(shù)字奇偶是相通的。不管某個(gè)數(shù)字有多大多奇特,我們永遠(yuǎn)可以將它“壓縮”成奇數(shù)或偶數(shù),用 1 bit 的 1 或 0 表示就可以。但是只說明某個(gè)未知數(shù)字是奇數(shù)(或偶數(shù)),我們就無法猜出該數(shù)字的準(zhǔn)確值。

上面的邏輯驗(yàn)證了哈希函數(shù)共有的 3 個(gè)特性:

  • consistency(一致性):相同的輸入只會(huì)生成相同的輸出信息
  • compression(壓縮):可以將體量很大的輸入壓縮成一個(gè)固定大小的輸出
  • lossiness(有損的):只通過檢查輸出無法反向計(jì)算出輸入值

但是對(duì)于一個(gè)滿足密碼學(xué)安全的哈希函數(shù)而言,除以上三點(diǎn)以外還需要具有如下屬性:

  • Preimage resistance
  • Second-preimage resistance
  • Collision resistance

Preimage Resistance

哈希函數(shù)的 preimage 是指能夠生成同一個(gè)特定指紋的所有輸入的合集。即對(duì)于某個(gè)哈希函數(shù) H 與摘要 k,所有能夠生成 k 的輸入值 x (滿足 H(x) = k)共同組成了 H 與 k 的 preimage。

preimage resistance 的意義即為,在僅僅只是知曉某個(gè)摘要的前提下,通過有限的計(jì)算無法獲取其 preimage 中的任何一個(gè)元素。即只通過結(jié)果無法知曉輸入。
摘要中不包含原始文檔的任何信息(lossiness),無法通過逆向運(yùn)算的方式由摘要反推出原始輸入。只能隨機(jī)地嘗試任意輸入,以期碰巧得到同樣的摘要信息(暴力破解)。

因此前面提到的奇偶函數(shù)就不能作為一個(gè)安全的哈希函數(shù)使用。假設(shè)使用奇偶作為哈希函數(shù)(奇數(shù)輸出 1,偶數(shù)輸出 0),則對(duì)于摘要 1,總可以很輕易的在 preimage(此處是全體奇數(shù))中找到任意多個(gè)摘要同為 1 的元素。這意味著原始輸入可以輕易被修改而不影響指紋數(shù)據(jù),則該指紋作為信息完整性的驗(yàn)證條件就失去了意義。

但是對(duì)于較安全的哈希算法如 MD5,由 MD5(x) = ca8a0fb205782051bd49f02eae17c9ee 就無法在有限的計(jì)算內(nèi)找到確定的 x 的值。
MD5 生成 16 字節(jié)(16 * 8 = 128bit)長(zhǎng)度的摘要,其中可以包含 2^128 種不同的數(shù)字組合。因此使用暴力破解的話,最多需要嘗試 2^128 = 340282366920938463463374607431768211456 次!
假設(shè)每秒鐘可以嘗試一百萬條輸入,仍需要 10^26 年完成所有驗(yàn)證操作!

Second-Preimage Resistance 與 Collision Resistance

second-primage resistance 是指即便知曉某個(gè)原始文檔以及由該文檔生成的摘要數(shù)據(jù),仍很難計(jì)算可以出生成同樣摘要的另一個(gè)不同的文檔。
即在已知 MD5(alice) = 384e2b2184bcbf58eccf10ca7a6563c 的情況下,仍無法找出除 alice 以外的另一個(gè)輸入生成同樣的摘要。為了尋求可以替換掉 alice 的另一個(gè)值,同時(shí)不影響摘要認(rèn)證,達(dá)到混淆的目的,最終仍需使用暴力破解的方式。

collision resistance 是指很難找出任意兩個(gè)生成相同摘要(相同而非特定)的輸入值。
可以參考“生日問題”,即在一個(gè)班級(jí)中,存在兩個(gè)生日為同一天的學(xué)生的概率遠(yuǎn)比存在一個(gè)生日為特定日期的學(xué)生的概率大得多。

collision resistance 的意義在于,無法故意找出兩套符合同一指紋的輸入以達(dá)到混淆的目的。比如 MD5 算法:

>>> from hashlib import md5
>>> md5('bob').hexdigest()
'9f9d51bc70ef21ca5c14f307980a29d8'
>>> md5('cob').hexdigest()
'386685f06beecb9f35db2e22da429ec9'

對(duì)于很相似的輸入 bob 和 cob,其指紋信息的差異卻非常大,沒有任何可供預(yù)測(cè)的規(guī)律。這得益于一種稱為 avalanche property 的特性:輸入的微小變化總可以在輸出中產(chǎn)生巨大的無法預(yù)測(cè)的差異。

由前面提到的生日問題可知,找出兩個(gè)生成相同指紋的元素遠(yuǎn)比找出某個(gè)可以生成特定指紋的元素要容易的多。以 MD5 算法的暴力破解為例,后者往往需要做 2^128 次嘗試,而前者只需要 2^64 次嘗試。
現(xiàn)實(shí)中 MD5 的 collision resistance 遠(yuǎn)非想象中那么優(yōu)異,甚至存在一種非暴力破解的方式 能夠在一小時(shí)以內(nèi)攻破 MD5 的 collision resistance。
所以盡量不要使用 MD5 這個(gè)已經(jīng)不再維護(hù)超過 10 年、安全漏洞存在 20 年的古老算法。

參考資料

Practical Cryptography in Python: Learning Correct Cryptography by Example

以上就是python密碼學(xué)示例——理解哈希(Hash)算法的詳細(xì)內(nèi)容,更多關(guān)于python 哈希(Hash)算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用python實(shí)現(xiàn)excel的Vlookup功能

    使用python實(shí)現(xiàn)excel的Vlookup功能

    這篇文章主要介紹了使用python實(shí)現(xiàn)excel的Vlookup功能,當(dāng)我們想要查找的數(shù)據(jù)量較大時(shí),這時(shí)則有請(qǐng)我們的主角VLookup函數(shù)出場(chǎng),那么如何用python實(shí)現(xiàn)VLookup呢,需要的朋友可以參考下
    2023-04-04
  • python+opencv實(shí)現(xiàn)霍夫變換檢測(cè)直線

    python+opencv實(shí)現(xiàn)霍夫變換檢測(cè)直線

    這篇文章主要為大家詳細(xì)介紹了python+opencv實(shí)現(xiàn)霍夫變換檢測(cè)直線,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 總結(jié)Python常用的魔法方法

    總結(jié)Python常用的魔法方法

    今天帶大家學(xué)習(xí)Python的相關(guān)知識(shí),文中對(duì)Python常用的魔法方法作了非常詳細(xì)的總結(jié),對(duì)正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • python里反向傳播算法詳解

    python里反向傳播算法詳解

    在本篇文章了小編給大家整理的是一篇關(guān)于python里反向傳播算法詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-11-11
  • Python 讀取xml數(shù)據(jù),cv2裁剪圖片實(shí)例

    Python 讀取xml數(shù)據(jù),cv2裁剪圖片實(shí)例

    這篇文章主要介紹了Python 讀取xml數(shù)據(jù),cv2裁剪圖片實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Python爬取數(shù)據(jù)保存為Json格式的代碼示例

    Python爬取數(shù)據(jù)保存為Json格式的代碼示例

    今天小編就為大家分享一篇關(guān)于Python爬取數(shù)據(jù)保存為Json格式的代碼示例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Python PyInstaller庫基本使用方法分析

    Python PyInstaller庫基本使用方法分析

    這篇文章主要介紹了Python PyInstaller庫基本使用方法,結(jié)合實(shí)例形式分析了Python PyInstaller庫的功能、安裝及相關(guān)使用注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • python中setuptools的作用是什么

    python中setuptools的作用是什么

    在本篇文章里小編給大家分享的是一篇關(guān)于python中setuptools的作用以及相關(guān)用法,需要的朋友們可以跟著學(xué)習(xí)下。
    2020-06-06
  • 老生常談python之鴨子類和多態(tài)

    老生常談python之鴨子類和多態(tài)

    下面小編就為大家?guī)硪黄仙U刾ython之鴨子類和多態(tài)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • Python判斷和循環(huán)語句的分析與應(yīng)用

    Python判斷和循環(huán)語句的分析與應(yīng)用

    判斷語句是用來篩選條件,過濾條件的。循環(huán)語句是用來解決重復(fù)性代碼的問題,提高工作效率。今天的知識(shí)點(diǎn)不多,耐心看完吧
    2022-07-07

最新評(píng)論