zoukankan      html  css  js  c++  java
  • 用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)
    
  • 相关阅读:
    android 蓝牙各种UUID (转)
    Linux下Shell重定向
    linux命令学习笔记——tee命令
    正则表达式之正向预查和反向预查
    shell常用正则表达式
    saltstack知识点
    linux命令学习笔记——ldd命令
    shell中${ } 的一些特异功能
    linux命令学习笔记——nl命令
    linux命令学习笔记——losetup命令:设置循环设备
  • 原文地址:https://www.cnblogs.com/xiaomage666/p/11011844.html
Copyright © 2011-2022 走看看