快捷搜索:  汽车  科技

python中常用的序列化模块(Python模块hmac-加密消息签名和验证)

python中常用的序列化模块(Python模块hmac-加密消息签名和验证)上例中,调用方法 hexdigest() 返回 digest() 的16进制表示,digest() 生成的是二进制数据,可能包含不可打印的字符,包括 NUL。也可以把二进制数据转换为 base64 编码的数据表示。Base 64 格式使用 new() 函数创建一个对象然后写入数据生成签名,签名默认使用的是 MD5 算法。执行:hmac.new() 第一个参数是自定义的 secret key。

python中常用的序列化模块(Python模块hmac-加密消息签名和验证)(1)

模块 hmac 实现了消息验证的哈希算法(RFC-2104--HMAC Keyed-Hashing for a Message Authentication)。

HMAC 算法用于验证在不同的应用之间传输的数据的一致性,或者是存放于危险位置的数据。

办法是使用一个 secret key 和数据生成一个加密的哈希值,当验证数据时,只需要重新生成哈希值并验证前后的两个哈希值相等。

生成哈希值


使用 new() 函数创建一个对象然后写入数据生成签名,签名默认使用的是 MD5 算法。

python中常用的序列化模块(Python模块hmac-加密消息签名和验证)(2)

执行:

python中常用的序列化模块(Python模块hmac-加密消息签名和验证)(3)

hmac.new() 第一个参数是自定义的 secret key。

Base 64 格式


上例中,调用方法 hexdigest() 返回 digest() 的16进制表示,digest() 生成的是二进制数据,可能包含不可打印的字符,包括 NUL。也可以把二进制数据转换为 base64 编码的数据表示。

python中常用的序列化模块(Python模块hmac-加密消息签名和验证)(4)

执行:

python中常用的序列化模块(Python模块hmac-加密消息签名和验证)(5)

应用消息签名


HMAC 应该始终在公共网络上应用,保证数据的安全是至关重要的。例如发送一段数据到一个管道 Pipe 或者 Socket,数据就应该签名,然后在使用之前进行验证。

下面的例子使用 io.BytesIO 模拟一个管道或者 Socket,加密生成的哈希值和数据通过模拟的数据流后,然后进行了验证。

首先定义传递的数据对象,使用模块 pickle 进行对象的序列化操作。

python中常用的序列化模块(Python模块hmac-加密消息签名和验证)(6)

首先定义了生成数据的类 TestData 和函数 make_digest() 生成签名,本例使用的签名算法是 SHA1。下一步使用 io.BytesIO 生成数据流表示管道或者 Socket,序列化对象使用模块 pickle。

python中常用的序列化模块(Python模块hmac-加密消息签名和验证)(7)

执行:

python中常用的序列化模块(Python模块hmac-加密消息签名和验证)(8)

使用模块 pickle 序列化对象后,将返回的字节流生成签名,然后把签名和数据写入输出流。最后从输出流获取数据,验证并打印结果。

比较签名使用的是 compare_digest() 函数,它实现了快速的比较速度以及有效避免时间攻击。

猜您喜欢: