python中常用的序列化模块(Python模块hmac-加密消息签名和验证)
python中常用的序列化模块(Python模块hmac-加密消息签名和验证)上例中,调用方法 hexdigest() 返回 digest() 的16进制表示,digest() 生成的是二进制数据,可能包含不可打印的字符,包括 NUL。也可以把二进制数据转换为 base64 编码的数据表示。Base 64 格式使用 new() 函数创建一个对象然后写入数据生成签名,签名默认使用的是 MD5 算法。执行:hmac.new() 第一个参数是自定义的 secret key。
模块 hmac 实现了消息验证的哈希算法(RFC-2104--HMAC Keyed-Hashing for a Message Authentication)。
HMAC 算法用于验证在不同的应用之间传输的数据的一致性,或者是存放于危险位置的数据。
办法是使用一个 secret key 和数据生成一个加密的哈希值,当验证数据时,只需要重新生成哈希值并验证前后的两个哈希值相等。
生成哈希值
使用 new() 函数创建一个对象然后写入数据生成签名,签名默认使用的是 MD5 算法。
执行:
hmac.new() 第一个参数是自定义的 secret key。
Base 64 格式
上例中,调用方法 hexdigest() 返回 digest() 的16进制表示,digest() 生成的是二进制数据,可能包含不可打印的字符,包括 NUL。也可以把二进制数据转换为 base64 编码的数据表示。
执行:
应用消息签名
HMAC 应该始终在公共网络上应用,保证数据的安全是至关重要的。例如发送一段数据到一个管道 Pipe 或者 Socket,数据就应该签名,然后在使用之前进行验证。
下面的例子使用 io.BytesIO 模拟一个管道或者 Socket,加密生成的哈希值和数据通过模拟的数据流后,然后进行了验证。
首先定义传递的数据对象,使用模块 pickle 进行对象的序列化操作。
首先定义了生成数据的类 TestData 和函数 make_digest() 生成签名,本例使用的签名算法是 SHA1。下一步使用 io.BytesIO 生成数据流表示管道或者 Socket,序列化对象使用模块 pickle。
执行:
使用模块 pickle 序列化对象后,将返回的字节流生成签名,然后把签名和数据写入输出流。最后从输出流获取数据,验证并打印结果。
比较签名使用的是 compare_digest() 函数,它实现了快速的比较速度以及有效避免时间攻击。