1.import os
os.urandom(num) 随机出一个num位的随机bytes
2.import hamc
md5_obj = hmac.new(盐,随机字符串)
r = md5_obj.digest()
拿到一个bytes的结果,也就是密文
补充:hashlib的加密
# md5_obj = hashlib.md5(sor)
# md5_obj.update(r_str.encode('utf-8'))
# result = md5_obj.hexdigest()
#server层
import socket
import hashlib
import os
import hmac
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()
conn,addr = sk.accept()
#盐
sor = b'alex'
#随机字符串
r_str = os.urandom(16)# 随机出一个16位长度的bytes
#将随机字符串先发送到客户端client
conn.send(r_str)
#用hmac将盐和字符串加密成密文,结果是一个md5对象
md5_obj = hmac.new(sor,r_str)
#result此时是bytes类型,不需要进行编码解码等操作
result = md5_obj.digest()
#接受来自客户端的密文进行合法性判断
msg = conn.recv(1024)
if msg == result:
#如果服务器端的密文和客户端发送过来的密文相匹配,则表示合法
conn.send(b'success')
else:
conn.send(b'failed')
conn.close()
sk.close()
#client层
import socket
import hmac
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
sor = b'alex'
#先接收来自服务器的随机字符串
r_str = sk.recv(1024)
#用hmac将盐和字符串加密成密文,结果是一个md5对象
md5_obj = hmac.new(sor,r_str)
#result此时是bytes类型,不需要进行编码解码等操作
result = md5_obj.digest()
#将密文发送给服务器端server进行客户端合法性校验
sk.send(result)
#接收服务器对客户端合法性的反应消息
msg = sk.recv(1024)
print(msg)
sk.close()
图片理解:
![](https://img2018.cnblogs.com/blog/1657120/201910/1657120-20191022121943539-1552561704.png)