设为首页 加入收藏

TOP

用tcp协议实现一个并发的socketserver 进行密文登录
2019-06-12 20:06:05 】 浏览:40
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 时间合集 一

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目