用tcp协议实现一个并发的socketserver 进行密文登录
程序员文章站
2022-04-09 11:26:09
先在客户端进行摘要,客户端把用户名作为盐。 然后在服务端进行二次摘要,用固定的盐(不能让别人知道你的盐是什么),然后存到文件中,密文存储。或者和文件中的密文对比。 这样即使在网络上用户信息被截获,和存在服务端文件中的用户密码密文也不同。 如果只能摘要一次(加密一次),就在服务端进行摘要。在客户端摘要 ......
先在客户端进行摘要,客户端把用户名作为盐。
然后在服务端进行二次摘要,用固定的盐(不能让别人知道你的盐是什么),然后存到文件中,密文存储。或者和文件中的密文对比。
这样即使在网络上用户信息被截获,和存在服务端文件中的用户密码密文也不同。
如果只能摘要一次(加密一次),就在服务端进行摘要。在客户端摘要,和明文一样,别人都能知道你的盐是什么。
用到的知识点:网络编程,socketserver模块,hashlib模块对密码进行加密,struct模块解决黏包问题
#userinfo文件 zhangsan|5701564ecae32e15698e774d993d6b2306028de0 lisi|099841fab9a5d7ef090eb725059b9b656efe25e5 #服务端代码: import struct import socketserver import hashlib class myserver(socketserver.baserequesthandler): def handle(self): conn = self.request salt = '加盐了'.encode('utf-8')#在服务端设置固定的盐 while true: try: len = conn.recv(4) name_len = struct.unpack('i',len)[0] name = conn.recv(name_len).decode('utf-8') ret = conn.recv(1024).decode('utf-8') sha = hashlib.sha1(salt) #在服务端加固定的盐 sha.update(ret.encode('utf-8'))#对加密后的密码进行二次加密 res = sha.hexdigest() with open('userinfo',encoding='utf-8',mode='r') as f: for line in f: line_lst = line.strip().split('|') if name == line_lst[0] and res == line_lst[1]: print('登录成功') conn.send('登录成功'.encode('utf-8')) break else: print('登录失败') conn.send('登录失败'.encode('utf-8')) except connectionreseterror: break server = socketserver.threadingtcpserver(('192.168.14.91',9003),myserver) server.serve_forever() #客户端代码: import socket import struct import hashlib sk = socket.socket() sk.connect(('192.168.14.247',9003)) name = input('请输入用户名:') #zhangsan password = input('请输入密码:').encode('utf-8') #123456 sha = hashlib.sha1(name.encode('utf-8'))#针对于每个账户,每个账户的盐都不一样 sha.update(password) ret = sha.hexdigest() name_len = struct.pack('i',len(name)) sk.send(name_len) sk.send(name.encode('utf-8'))#发送用户名 sk.send(ret.encode('utf-8'))#发送摘要后的密码 msg = sk.recv(1024).decode('utf-8') print(msg)