先在客戶端進行摘要,客戶端把用戶名做爲鹽。python
而後在服務端進行二次摘要,用固定的鹽(不能讓別人知道你的鹽是什麼),而後存到文件中,密文存儲。或者和文件中的密文對比。編程
這樣即便在網絡上用戶信息被截獲,和存在服務端文件中的用戶密碼密文也不一樣。網絡
若是隻能摘要一次(加密一次),就在服務端進行摘要。在客戶端摘要,和明文同樣,別人都能知道你的鹽是什麼。socket
用到的知識點:網絡編程,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)