python--hmac
检测一下客户端是否合法,不依靠登录认证.这样即使知道服务端ip和端口,客户端也不能随便就连接服务端
实现机制是在服务端中设置了密钥,借用了hmac os 两个模块
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket import os #导入os模块 import hmac #导入hmac模块 sk=socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() secret_key=b'zzy123' #设置密钥 def check_conn(conn): """ 验证客户端密钥 :param conn: 客户端连接conn :return: True or Flase 验证客户端的密钥和服务端是否一致 """ msg=os.urandom(32) #随机获取一个32位的bytes类型的字符串随机验证码 conn.send(msg) #把这个字符串随机验证码发给客户端 h=hmac.new(secret_key,msg) #对密钥和随机验证码进行hmac加密,类似于把密钥加盐,得到一个加密对象 digest=h.digest() #获取加盐密钥 clint_secret_key=conn.recv(1024) #接收客户端传来的密钥 return hmac.compare_digest(digest, clint_secret_key) #比较客户端的密钥和服务端是否一致 conn, addr = sk.accept() #建立socket连接 ret=check_conn(conn) #调用函数,得到返回值True or Flase if ret: #如果是True,则是合法的客户端 print('合法的客户端') sk.close() else: print('不合法的客户端') sk.close()
""" 总结:检测一下客户端是否合法 1:hmac 加密模块 功能和用法类似hashlip 2:h=hmac.new() 括号里放你想加密的内容secret_key等 得到的h加密对象 3:digest=h.digest() 得到最终的密钥digest 4:compare_digest() 对比密钥的内置函数,括号里放你要比较的两个密文 5:import os os.urandom() 随机获取多少位的bytes类型的字符串 """
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import socket import os import hmac sk=socket.socket() secret_key=b'zzy123' #设置密钥 sk.connect(('127.0.0.1',8080)) ret=sk.recv(1024) #接收服务端发来的随机验证码 h=hmac.new(secret_key,ret) #把客户端发来的随机验证码和自己设置的密钥 用hmac加密 msg=h.digest() #获取加盐密钥 sk.send(msg) #把加盐密钥发给服务端 sk.close()