亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python中HMAC加密算法的應(yīng)用

 更新時(shí)間:2023年05月18日 14:40:35   作者:Python知識(shí)大全  
HMAC?算法可用于驗(yàn)證在應(yīng)用程序之間傳遞或存儲(chǔ)在潛在易受攻擊位置的信息的完整性,因此本文為大家整理了一些Python中HMAC加密算法的應(yīng)用,希望對(duì)大家有所幫助

HMAC 算法可用于驗(yàn)證在應(yīng)用程序之間傳遞或存儲(chǔ)在潛在易受攻擊位置的信息的完整性?;舅枷胧巧膳c共享密鑰組合的實(shí)際數(shù)據(jù)的加密散列。然后,可以使用所得到的散列來(lái)檢查所發(fā)送或存儲(chǔ)的消息以確定信任級(jí)別,而不發(fā)送秘密密鑰。

簽名消息

new() 函數(shù)創(chuàng)建一個(gè)用于計(jì)算消息簽名的新對(duì)象。此示例使用默認(rèn)的 MD5 散列算法。

```python
hmac_simple.py
import hmac
digest_maker = hmac.new(b'secret-shared-key-goes-here')with open('lorem.txt', 'rb') as f:
    while True:
        block = f.read(1024)
        if not block:
            break
        digest_maker.update(block)digest = digest_maker.hexdigest()print(digest)

運(yùn)行時(shí),代碼讀取數(shù)據(jù)文件并為其計(jì)算 HMAC 簽名。

$ python3 hmac_simple.py
4bcb287e284f8c21e87e14ba2dc40b16

可選的摘要類(lèi)型

盡管默認(rèn)的 hmac 算法是 MD5,但那不是最安全的方法。MD5 摘要算法有一些缺點(diǎn),例如碰撞?(兩個(gè)不同的消息產(chǎn)生了不同的哈希值)。SHA-1 被公認(rèn)為是比較健壯的,應(yīng)該使用它。

hmac_sha.py
import hmac
import hashlib
digest_maker = hmac.new(
    b'secret-shared-key-goes-here',
    b'',
    hashlib.sha1,)with open('hmac_sha.py', 'rb') as f:
    while True:
        block = f.read(1024)
        if not block:
            break
digest_maker.update(block)digest = digest_maker.hexdigest()print(digest)

new() 函數(shù)接受三個(gè)參數(shù)值,第一個(gè)是密鑰,共享于兩個(gè)通信的端點(diǎn)之間,所以?xún)蓚€(gè)端點(diǎn)都使用相同的值。第二個(gè)參數(shù)是初始化消息值。如果需要認(rèn)證的消息內(nèi)容非常小,例如時(shí)間戳或者 HTTP POST,那么整個(gè)消息體可以傳入 new() 而不用 update() 方法。最后一個(gè)參數(shù)是要使用的摘要算法。默認(rèn)的是 hashlib.md5,例子中使用的是 hashlib.sha1。

$ python3 hmac_sha.py
dcee20eeee9ef8a453453f510d9b6765921cf099

二進(jìn)制摘要

前一個(gè)例子使用了 hexdigest() 方法生成可打印的摘要字符串。這個(gè)摘要字符串是由 digest() 方法生成的值的不同表現(xiàn)形式而已,這

hmac_base64.py
import base64
import hmac
import hashlib
with open('lorem.txt', 'rb') as f:
    body = f.read()hash = hmac.new(
    b'secret-shared-key-goes-here',
    body,
    hashlib.sha1,)digest = hash.digest()print(base64.encodestring(digest))

base64 編碼的字符串以換行符結(jié)尾,當(dāng)將字符串嵌入到 HTTP 頭或者其他敏感的上下文中時(shí),經(jīng)常需要將這個(gè)換行符刪除。

$ python3 hmac_base64.py
b'olW2DoXHGJEKGU0aE9fOwSVE/o4=\n'

消息簽名的應(yīng)用

HMAC 算法應(yīng)該用于任何公共網(wǎng)絡(luò)服務(wù),并且任何數(shù)據(jù)都應(yīng)該存儲(chǔ)在安全性很重要的地方。例如,當(dāng)數(shù)據(jù)被通過(guò)管道或者 socket 發(fā)送的時(shí)候,數(shù)據(jù)應(yīng)該被簽名,然后在使用之前驗(yàn)簽。此處給出的擴(kuò)展示例位于文件 hmac_pickle.py。

第一步是創(chuàng)建一個(gè)函數(shù)計(jì)算一個(gè)字符串的摘要,以及一個(gè)簡(jiǎn)單的類(lèi),用于實(shí)例化并通過(guò)通信通道傳遞。

hmac_pickle.py
import hashlib
import hmac
import io
import pickle
import pprint
def make_digest(message):
    "Return a digest for the message."
    hash = hmac.new(
        b'secret-shared-key-goes-here',
        message,
        hashlib.sha1,
    )
    return hash.hexdigest().encode('utf-8')class SimpleObject:
    """Demonstrate checking digests before unpickling.
    """
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return self.name

接下來(lái),創(chuàng)建一個(gè) BytesIO 緩沖池代表一個(gè) socket 或者管道。例子中使用了一個(gè)原生的,但是很容易解析的,格式化的數(shù)據(jù)流。首先數(shù)據(jù)的摘要和長(zhǎng)度被寫(xiě)入,后面緊跟了一個(gè)換行符。對(duì)象的序列化形式由 pickle 生成。真實(shí)的系統(tǒng)可能不希望依賴(lài)于長(zhǎng)度值,因?yàn)槿绻e(cuò)誤,則長(zhǎng)度也是錯(cuò)誤的。某些不太可能出現(xiàn)在實(shí)際數(shù)據(jù)中的終結(jié)符序列可能更加合適。

然后示例程序中往數(shù)據(jù)流中寫(xiě)入了兩個(gè)對(duì)象。第一個(gè)是使用正確的摘要值寫(xiě)入的。

使用緩沖區(qū)模擬可寫(xiě)套接字或者管道

out_s = io.BytesIO()

往流中寫(xiě)入一個(gè)有效的對(duì)象

digest\nlength\npickle

o = SimpleObject('digest matches')
pickled_data = pickle.dumps(o)
digest = make_digest(pickled_data)
header = b'%s %d\n' % (digest, len(pickled_data))
print('WRITING: {}'.format(header))
out_s.write(header)
out_s.write(pickled_data)

第二個(gè)寫(xiě)入流中的對(duì)象使用了一個(gè)無(wú)效的摘要值,摘要值是由其他一些數(shù)據(jù)生成的而不是序列化之后的值。

往流中寫(xiě)入一個(gè)無(wú)效的對(duì)象

o = SimpleObject('digest does not match')
pickled_data = pickle.dumps(o)
digest = make_digest(b'not the pickled data at all')
header = b'%s %d\n' % (digest, len(pickled_data))
print('\nWRITING: {}'.format(header))
out_s.write(header)
out_s.write(pickled_data)
out_s.flush()

記住數(shù)據(jù)是在 BytesIO 緩沖池中的,它可以再次被讀出。首先讀取帶有摘要和數(shù)據(jù)長(zhǎng)度的行。然后使用長(zhǎng)度值讀取剩下的數(shù)據(jù)。pickle.load() 可以直接從流中讀取數(shù)據(jù),但是它假設(shè)一個(gè)可信任的數(shù)據(jù)流,而且這個(gè)數(shù)據(jù)還不足夠可信能夠反序列化它。從流中讀取序列化值為字符串,而不實(shí)際反序列化更安全。

使用 BytesIO 模擬可讀的 socket 或者管道

in_s = io.BytesIO(out_s.getvalue())

讀取數(shù)據(jù)

while True:
    first_line = in_s.readline()
    if not first_line:
        break
    incoming_digest, incoming_length = first_line.split(b' ')
    incoming_length = int(incoming_length.decode('utf-8'))
    print('\nREAD:', incoming_digest, incoming_length)

一旦序列化數(shù)據(jù)被讀取到內(nèi)存,摘要值可以被重新計(jì)算,并且使用 compare_digest() 同傳遞過(guò)來(lái)的數(shù)據(jù)比較。如果摘要匹配,證明它是安全的去信任數(shù)據(jù)并且反序列化它。

 incoming_pickled_data = in_s.read(incoming_length)
    actual_digest = make_digest(incoming_pickled_data)
    print('ACTUAL:', actual_digest)
    if hmac.compare_digest(actual_digest, incoming_digest):
        obj = pickle.loads(incoming_pickled_data)
        print('OK:', obj)
    else:
        print('WARNING: Data corruption')

輸出表示第一個(gè)對(duì)象被驗(yàn)證通過(guò),第二個(gè)被視為「損壞」。

$ python3 hmac_pickle.py

WRITING: b'f49cd2bf7922911129e8df37f76f95485a0b52ca 69\n'

WRITING: b'b01b209e28d7e053408ebe23b90fe5c33bc6a0ec 76\n'

READ: b'f49cd2bf7922911129e8df37f76f95485a0b52ca' 69
ACTUAL: b'f49cd2bf7922911129e8df37f76f95485a0b52ca'
OK: digest matches

READ: b'b01b209e28d7e053408ebe23b90fe5c33bc6a0ec' 76
ACTUAL: b'2ab061f9a9f749b8dd6f175bf57292e02e95c119'
WARNING: Data corruption

可以在定時(shí)攻擊中使用簡(jiǎn)單的字符串或字節(jié)比較來(lái)比較兩個(gè)摘要,以通過(guò)傳遞不同長(zhǎng)度的摘要來(lái)暴露部分或全部秘密密鑰。compare_digest() 實(shí)現(xiàn)了一個(gè)快速但是常量時(shí)間的比較函數(shù)去防止定時(shí)攻擊。

到此這篇關(guān)于Python中HMAC加密算法的應(yīng)用的文章就介紹到這了,更多相關(guān)Python HMAC內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論