验证客户端的合法性
验证客户端的合法性
-
使用场景:在公司内部,无用户的情况下使用
-
思路:
- 客户端和服务端都有一个相同的密钥(密钥不能进行传输,原因:以防非法拦截)
- 客户端与服务端建立连接后,服务端向客户端发送一个随机字符串os.urandom(16)
- 服务端与客户端都对随机字符串使用密钥进行加密,将得到一个新的字符串
- 客户端将新的字符串传输给服务端
- 服务端对客户端传来加完密钥后的生成的字符串和自己加完密钥后产生的字符串经行对比,如果一致则建立连接
-
服务端
import os import hashlib import socket miyao='qwertyuiop' sk=socket.socket() sk.bind(('127.0.0.1',1235)) sk.listen() while True: conn,addr=sk.accept() ret = os.urandom(16) #生成随机数 conn.send(ret) #传输随机数 sha = hashlib.sha1(miyao.encode('utf-8')) #加盐 sha.update(ret) s = sha.hexdigest() #加密 msg=conn.recv(1024).decode('utf-8') if s==msg: #判断加密后的字符串是否一致 conn.send('建立连接'.encode('utf-8')) while True: s=conn.recv(1024).decode('utf-8') if s.upper()=='Q':break print(s) conn.close() else: conn.close()
-
客户端
import os import hashlib import socket miyao='qwertyuiop' sk=socket.socket() sk.connect(('127.0.0.1',1235)) ret=sk.recv(16) sha=hashlib.sha1(miyao.encode('utf-8')) sha.update(ret) s=sha.hexdigest() print(s) sk.send(s.encode('utf-8')) s=sk.recv(1024).decode('utf-8') print(s) while True: msg=input('请输入信息:') sk.send(msg.encode('utf-8')) if msg.upper()=='Q':break sk.close()
-
hmac 可以代替hashlib进行直接把密钥和字符串进行加密,直接生成bytes格式进行网络传输
-
使用方法
import hmac import os h=hmac.new(b'qwer',os.urandom(16)) s=h.digest() print(s) 得:b'\xc0\xff\x8d\xd4\\(W\xba\xd9\n\xcfy\x0eR\xdb0'
-
服务端
import os import socket miyao=b'qwertyuiop' import hmac sk=socket.socket() sk.bind(('127.0.0.1',1235)) sk.listen() while True: conn,addr=sk.accept() ret = os.urandom(16) #生成随机数 conn.send(ret) #传输随机数 h=hmac.new(miyao,ret) s=h.digest() msg=conn.recv(1024) if s==msg: #判断加密后的字符串是否一致 conn.send('建立连接'.encode('utf-8')) while True: s=conn.recv(1024).decode('utf-8') if s.upper()=='Q':break print(s) conn.close() else: conn.close()
-
客户端
import hmac import socket miyao=b'qwertyuiop' sk=socket.socket() sk.connect(('127.0.0.1',1235)) ret=sk.recv(16) h=hmac.new(miyao,ret) s=h.digest() sk.send(s) s=sk.recv(1024).decode('utf-8') print(s) while True: msg=input('请输入信息:') sk.send(msg.encode('utf-8')) if msg.upper()=='Q':break sk.close()
-