hmac与hashlib模块的区别
hmac模块
- 基于
hashlib
提供的哈希算法,在计算哈希时加入了一个“密钥”。 - 主要用于生成“消息认证码”(MAC),通过一个密钥和数据共同生成哈希值,以此来验证数据的完整性和身份。
- 需要密钥,它的目的是防止消息篡改并验证消息是否来源于可信的发送方。
hashlib
- 主要用于计算消息的哈希值,支持多种哈希算法,如 MD5、SHA-1、SHA-256 等。
- 计算的是“纯粹的”哈希值,即输入数据的哈希摘要。
- 没有密钥相关的操作,因此主要用于数据完整性验证和指纹生成。
hmac的使用场景,同时介绍如何使用
使用hmac生成密钥,发送给要连接的客户端。用于检验客户端的合法性
server端代码 :
import hashlib import hmac import socket import ossecret_key = b'python' # 一个密钥,客户端与服务端约定好的 # ... sk = socket.socket() sk.bind(('127.0.0.1', 8080)) sk.listen() conn, addr = sk.accept()def check_conn(conn):"""校验客户端的合法性:param conn::return:"""msg = os.urandom(32) # 随机生成一个32位的内容 conn.send(msg)# hmac.new() 用于创建一个新的 HMAC 对象,初始化 HMAC 计算。它需要密钥、消息和哈希算法作为输入。h = hmac.new(secret_key, msg, digestmod=hashlib.sha256)# 获取最终的 HMAC 结果,返回的是原始的字节数据(消息认证码)digest_msg = h.digest()client_digest_msg = conn.recv(1024) # 客户端收到随机数后,使用与server相同的方式进行加密,并发给服务端# 服务端将自己的加密结果与客户端的加密结果进行比较return hmac.compare_digest(digest_msg, client_digest_msg) res = check_conn(conn) if res is True:print("合法的登录")conn.close() else:print("不合法的登录")conn.close()
client端代码:
import hashlib import socket import hmacsecret_key = b'python' # 一个密钥,客户端与服务端约定好的 sk = socket.socket() sk.connect(('127.0.0.1', 8080))msg = sk.recv(1024) # 收到服务端发过来的随机数# 使用与服务端同样的密钥,随机数,哈希算法,进行加密 h = hmac.new(secret_key, msg, digestmod=hashlib.sha256)# 获取最终的结果,并发给服务端。对方验证客户端是否合法 digest_msg = h.digest() sk.send(digest_msg) sk.close()