欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

用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)