31.Python基础篇-hmac模块

hmac与hashlib模块的区别

hmac模块

  • 基于 hashlib 提供的哈希算法,在计算哈希时加入了一个“密钥”。
  • 主要用于生成“消息认证码”(MAC),通过一个密钥和数据共同生成哈希值,以此来验证数据的完整性和身份。
  • 需要密钥,它的目的是防止消息篡改并验证消息是否来源于可信的发送方。

hashlib

  • 主要用于计算消息的哈希值,支持多种哈希算法,如 MD5、SHA-1、SHA-256 等。
  • 计算的是“纯粹的”哈希值,即输入数据的哈希摘要。
  • 没有密钥相关的操作,因此主要用于数据完整性验证和指纹生成。

hmac的使用场景,同时介绍如何使用

使用hmac生成密钥,发送给要连接的客户端。用于检验客户端的合法性

server端代码 :

import hashlib
import hmac
import socket
import os

secret_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 hmac

secret_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()

 

posted @ 2024-12-21 17:54  邵杠杠  阅读(29)  评论(0编辑  收藏  举报