1. 密码单向加密
from PyQt5.QtCore import QCryptographicHash
def EncryptPassword(strPassword):
if len(strPassword) == 0:
return strPassword
# 密码转成bytes格式
baPassword = strPassword.encode('utf-8')
# 对密码进行加密
md5 = QCryptographicHash.hash(baPassword, QCryptographicHash.Md5)
baCryPassword = md5.toHex()
strCryPassword = str(baCryPassword, encoding='utf-8')
return strCryPassword
2. 通信时的连接认证
1)客户端连接成功之后,向服务器发送固定字符串“xxxx”启动认证流程,服务端没有收到该字符串直接断开。
2)服务器会向客户端发送一个32位的随机码,客户端将该随机码与连接密钥进行加盐混合算法加密后转为二进制发给服务器校验。
3)服务器校验通过后方可正常通信,否则断开。
服务端代码:
import hmac
def conn_auth(conn, secret_key):
authStr = conn.recv(4) # 长度取决于客户端发送什么字符串启动,一致即可
msg = os.urandom(32) # 生成一个32位的随机码,bytes
conn.send(msg) # 发送随机码给想接入的连接
key = secret_key.encode('utf-8') # 传入的密钥是str,转成bytes
h = hmac.new(key, msg) # 将随机码与连接密钥混合(加盐操作)
digest = h.digest() # 转化为二进制
response = conn.recv(len(digest)) # 接收对方发来的加盐结果
return hmac.compare_digest(response, digest) # 返回一个bool,是对比结果
客户端代码:
import hmac
def conn_auth(conn, secret_key):
conn.send('xxxx') # 字符串内容自定义,和服务端一致即可
msg = conn.recv(32) #