用tcp協議實現一個併發的socketserver 進行密文登陸

先在客戶端進行摘要,客戶端把用戶名做爲鹽。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)
相關文章
相關標籤/搜索