hmac检验客户端合法性

  1.服务端

# 验证客户端是否合法
# 不依靠登陆认证


# 当有一个客户端访问你的时候,建立了tcp后,server端主动发起一个数据,数据为想加密的bytes类型的数据。
    # 客户端拿到要加密的bytes类型的数据,

# import hmac     # 该模块与hashlib类似
# import os
#
# h = hmac.new()  # secret_key 需要一个密钥,与想要加密的bytes类型数据
# content = h.digest()  # 拿到一个密文内容
# hmac.compare_digest()   # 比较 ,密文与另外一个密文
#
# print(os.urandom(32))   # 随机生成32个字节

import socket
import hmac     # 该模块与hashlib类似
import os

def check_conn(conn):
    random_msg = os.urandom(32) # 得到一个随机的32个字节
    conn.send(random_msg)   # 随机发送32个字节
    h = hmac.new(secret_key, random_msg)    # 使用密钥secret_key对发送出去的32个随机字节进行加密得到一个hmac对象
    digest = h.digest()     # 由hmac对象得到一个密文
    client_digest = conn.recv(1024)
    return hmac.compare_digest(digest, client_digest)  # 比较自己对32个字节加密后得到的密文,与客户端得到32个字节后加密得到的密文是否一样


secret_key = b'egg'  # 密钥
sk = socket.socket()

sk.bind(('127.0.0.1', 8090))

sk.listen()

conn, addr = sk.accept()

res = check_conn(conn)
if res:
    print('合法的客户端')
    conn.send(b'OK')
else:
    print('不合法的客户端')
    conn.send(b'NO')

conn.close()
sk.close()

  

  客户端

import socket
import hmac


secret_key = b'egg'

sk = socket.socket()

sk.connect(('127.0.0.1', 8090))

msg = sk.recv(1024)     # 得到的是的32个随机字节

h = hmac.new(secret_key, msg)   # 根据与服务端协商好的secret_key,对收到的32个随机字节进行加密,得到一个hmac对象

digest = h.digest() # 由hmac对象得到了32随机字节与secret_key加密后的密文内容

sk.send(digest) # 将密文内容发送到服务端

print(sk.recv(1024).decode('utf-8'))

sk.close()

猜你喜欢

转载自www.cnblogs.com/whylinux/p/9749883.html