设为首页 加入收藏

TOP

用tcp协议实现一个并发的socketserver 进行密文登录
2019-06-12 20:06:05 】 浏览:8
Tags:tcp 协议 实现 一个 并发 socketserver 进行 登录

先在客户端进行摘要,客户端把用户名作为盐。

然后在服务端进行二次摘要,用固定的盐(不能让别人知道你的盐是什么),然后存到文件中,密文存储。或者和文件中的密文对比。

这样即使在网络上用户信息被截获,和存在服务端文件中的用户密码密文也不同。

如果只能摘要一次(加密一次),就在服务端进行摘要。在客户端摘要,和明文一样,别人都能知道你的盐是什么。

用到的知识点:网络编程,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)

编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇找bug的过程 下一篇python 时间合集 一

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(217) }