Python实现安全课程设计

写在前面

       很多时候我们碰到的问题看似很困难,甚至觉得无从下手,但当我们真的尝试去做的时候,就会发现其实世上无难事,只怕有心人。
  前段时间学习给安排了一次课程设计,但我一直忙着做其他事情,这两天终于闲了一些,有空来敲敲代码了,我的内心是快(ju)乐(jue)的。看到了小灰灰早早的敲完然后还开源到了CSDN,那我也就来凑个热闹,第一篇博客就如此吧。今天早上终于把七篇都完成了,也算是顺带复习了Python的基础语法,面向对象和网络编程,好了那么话不多说,进入今天的主题吧。

题目一:暴力破解密码

要求:
1、设计一个信息系统,该系统可为学籍管理系统、订餐系统、票务管理系统不限, 系统必须通过客户端录入账号口令远程登录;
2、系统内至少包含三个以上账号,密码为 6 位以上数字组成;
3、设计程序在该系统所在服务器端进行暴力密码破解,破解后将账号密码通过套接字发送 出去;
4、在客户端用破解得到的账号口令进行登录,验证破解成功

# 服务端server
import socketserver
import socket
import json

# 服务器用户信息数据库
user_db = {'xiaohuihui':'666666','jige':'888888','cxp':'777777'}

print('等待主机连接......')
# 定义TargetServer类,允许tcp的并发连接,也就是多个客户端同时访问
class TargetServer(socketserver.BaseRequestHandler):
    # 定义父类的句柄方法
    def handle(self):
        # 以下代码实现自定义的逻辑
        print('IP为{}的客户端已连接,端口为{}'.format(self.client_address[0],self.client_address[1]))
        server_info = ('''
                           --------  欢迎来到112信息管理系统  --------
                       ''')
        # 发送上述消息
        self.request.send(server_info.encode())

        while True:
            # 接收用户名和密码并打印
            client_res = self.Server_Recv()
            self.Client_Info(client_res)

            # 执行验证程序,向客户端发送登录结果
            if self.Login(client_res) == 'pass':
                self.request.send('pass'.encode())

                # 验证通过,则可以与服务端进行socket通信
                self.Talk()
                break
           
            # 用户名或密码错误则断开连接
            else:
                self.request.send('fall'.encode())
                print('账户密码不匹配,已断开连接!')

        # 客户端断开连接
        print('等待新主机连接中......')


    # 服务器接收用户名和密码的方法
    def Server_Recv(self):
        user_info = self.request.recv(1460)
        str_user_info = user_info.decode()
        # 将字典序列化成字符串并返回
        return json.loads(str_user_info)

    # 服务端内打印用户名和密码的方法
    def Client_Info(self,client_res):
        print('客户端登陆成功:')
        for i in client_res:
            print(i + ':' + client_res[i])

    # 登录验证的方法
    def Login(self,client_res):
        for j in user_db:
            if (j == client_res['username']) and (user_db[j] == client_res['password']):
                return 'pass'

    # 客户端与服务端通信函数方法
    def Talk(self):
        while True:
            # 接收客户端的消息
            clinet_message = self.request.recv(1460)
            if clinet_message == (b'q'):
                print('已与客户端断开连接!')
                return
            # 客户端若未发送消息直接断开连接,则服务端终止停止通信
            if len(clinet_message) == 0:
                print('客户端已经断开!')
                return
            print(clinet_message.decode())

            # 服务端发消息
            server_message = input('----->')
            self.request.send(server_message.encode())
            if server_message == 'q':
                print('已与客户端断开连接!')
                return


# 实例化socketserver对象server_socket
server_socket = socketserver.ThreadingTCPServer(('127.0.0.1',10310),TargetServer)
# 循环调用,实现并发
server_socket.serve_forever()
# 爆破端burst
import socket
import json
import time
import os

# 实例化套接字对象
burst_socket = socket.socket()

print('----------->等待连接target......')
# 与服务器建立连接
burst_socket.connect(('127.0.0.1', 10310))
print(burst_socket.recv(1460).decode())
print('----------->已连接上target!')

user = input('请输入要burst的用户:').strip()
start_pwd = input('请选择burst的开始值:').strip()
end_pwd = input('请选择burst的结束值:').strip()

flag = True
while flag:
    pwd = start_pwd
    while True:
        # 将用户名和密码构成字典
        burst_dict = {'username':user,'password':pwd}
        # # 发送前先将用户信息字典序列化为字符串
        str_burst_dict = json.dumps(burst_dict)
        burst_socket.send(str_burst_dict.encode())

        res = burst_socket.recv(1460).decode()

        print('正在burst用户:' + burst_dict['username'] + '  尝试密码:' + burst_dict['password'])
        if  res == 'pass':
            print('-----------burst成功!' + '目标密码为:' + burst_dict['password'] + '-----------')
            burst_socket.close()
            print('已经与服务器断开连接')
            # 改变flag并退出循环
            flag = False
            break
        else:
            print('burst失败...' + '尝试密码为:' + burst_dict['password'])
            # 到达设定边界,爆破失败!
            if pwd == end_pwd:
                burst_socket.close()
                break
            pwd = int(pwd) + 1
            pwd = str(pwd)

    # 如果爆破成功,跳出循环
    if flag == False:
        break
    # 否则终止程序!
    else:
        print('-----------burst失败!请重新运行本程序选择其他范围!-----------')
        os._exit(0)


# 实例化套接字对象,向client发送burst后的密码
burst_server_socket = socket.socket()
burst_server_socket.bind(('127.0.0.1',10140))
# 设置端口重用
burst_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
burst_server_socket.listen()

print('--------等待getpwd--------')
# 等待客户端上线
conn,addr = burst_server_socket.accept()
print(addr[0] + '主机以上线')

# 发送被爆破成功的用户名
conn.send(burst_dict['username'].encode())
print('用户名已发送!')
# 防止tcp的黏包,设置缓冲时间
time.sleep(0.5)
# 发送被爆破成功的密码
conn.send(burst_dict['password'].encode())
print('密码已发送!')

# 四次挥手
conn.close()
# 关闭套接字
burst_server_socket.close()
# 客户端client
import socket
import json

# 实例化套接字对象
get_pwd = socket.socket()
# 与burst服务器建立连接
get_pwd.connect(('127.0.0.1',10140))

print('等待burst发送password......')
# 接收burst程序发来的账号和密码
username = get_pwd.recv(1460).decode()
password = get_pwd.recv(1460).decode()
print('用户名:' + username + '密码:' + password)

# 关闭与burst服务器的连接
get_pwd.close()


# 实例化socket对象
client_socket = socket.socket()
# 与服务器建立连接
client_socket.connect(('127.0.0.1',10310))

# 客户端登录函数
def SingIn():
    username = input('请输入用户名:').strip()
    password = input('请输入密码:').strip()
    # 将用户名和密码构成字典
    user_dict = {'username' : username, 'password' : password}
    # 发送前先将用户信息字典序列化为字符串
    str_user_dict = json.dumps(user_dict)
    client_socket.send(str_user_dict.encode())

# 客户端与服务端通信函数
def Talk():
    while True:
        client_message = input('----->')
        client_socket.send(client_message.encode())
        if client_message == 'q':
            print('已与服务端断开连接!')
            return

        server_message = client_socket.recv(1460)
        if server_message == b'q':
            client_socket.close()
            print('已与服务端断开连接!')
            return
        print(server_message.decode())



# 先打印客户端发送的信息
print(client_socket.recv(1460).decode())

while True:
    # 执行登录函数
    SingIn()
    # 查看登录的结果
    res = client_socket.recv(1460).decode()

    if res == 'pass':
        print('登陆成功!')
        Talk()
        break
    else:
        print('账号或密码错误!请重新输入!')

# 关闭套接字
client_socket.close()

演示:
在这里插入图片描述

题目二:字典破解密码

要求:
1、设计一个信息系统,该系统可为学籍管理系统、订餐系统、票务管理系统不限, 系统必须通过客户端录入账号口令远程登录;
2、系统内至少包含三个以上账号,密码为 6 位以上任意字符组成;
3、设计程序设计程序在该系统所在服务器端进行字典密码破解,破解后将账号密码通过套 接字发送出去;

# 服务端server
import socketserver
import socket
import json


# 服务器用户信息数据库
user_db = {'xiaohuihui':'666666','jige':'888888','xiaopengpeng':'777777'}

print('等待主机连接......')
# 定义TargetServer类,允许tcp的并发连接
class TargetServer(socketserver.BaseRequestHandler):
    # 定义父类的句柄方法
    def handle(self):
        # 实现自定义的逻辑

        print('IP为{}的客户端已连接,端口为{}'.format(self.client_address[0],self.client_address[1]))
        server_info = ('''
                           --------  欢迎来到112信息管理系统  --------
                       ''')
        # 发送上述消息
        self.request.send(server_info.encode())

        while True:
            # 接收用户名和密码并打印
            client_res = self.Server_Recv()
            self.Client_Info(client_res)

            # 执行验证程序,向客户端发送登录结果
            if self.Login(client_res) == 'pass':
                self.request.send('pass'.encode())

                # 验证通过,可以与服务端进行socket通信
                self.Talk()
                break
            # 用户名或密码错误则断开连接
            else:
                self.request.send('fall'.encode())
                print('账户密码不匹配,已断开连接!')

        print('等待新主机连接中......')



    # 服务器接收用户名和密码的函数
    def Server_Recv(self):
        user_info = self.request.recv(1460)
        str_user_info = user_info.decode()
        return json.loads(str_user_info)

    # 服务端内打印用户名和密码的函数
    def Client_Info(self,client_res):
        print('客户端登陆成功:')
        for i in client_res:
            print(i + ':' +client_res[i])

    # 登录验证的函数
    def Login(self,client_res):
        for j in user_db:
            if (j == client_res['username']) and (user_db[j] == client_res['password']):
                return 'pass'

    # 客户端与服务端通信函数
    def Talk(self):
        while True:
            # 接收客户端的消息
            clinet_message = self.request.recv(1460)
            if clinet_message == (b'q'):
                print('已与客户端断开连接!')
                return
            # 客户端若未发送消息直接断开连接,则服务端终止停止通信
            if len(clinet_message) == 0:
                print('客户端已经断开!')
                return
            print(clinet_message.decode())

            # 服务端发消息
            server_message = input('----->')
            self.request.send(server_message.encode())
            if server_message == 'q':
                print('已与客户端断开连接!')
                return


# 实例化socketserver对象server_socket
server_socket = socketserver.ThreadingTCPServer(('127.0.0.1',10310),TargetServer)
# 循环调用
server_socket.serve_forever()
# 字典爆破端dict_pwd
import socket
import json
import time
import os
# 实例化套接字对象
burst_socket = socket.socket()

print('----------->等待连接target......')
burst_socket.connect(('127.0.0.1', 10310))
print(burst_socket.recv(1460).decode())
print('----------->已连接上target!')

file_path = input('请输入使用的dict路径:')
username = input('请输入目标用户名:')
list_pwd = []

with open(file_path, mode="r", encoding="utf-8") as fp:
    # 先读文件,把密码存到res里
    res = fp.readline().strip()
    while res:
        # 将res字符串追加到列表中
        list_pwd.append(res)
        res = fp.readline().strip()

# 大循环:判断字典的可用性
flag = True
while flag:
    # 遍历列表
    for i in list_pwd:
        # 将用户名和遍历列表后的结果组成字典序列化后发往服务端
        dict_pwd = {'username':username,'password':i}
        str_dict_pwd = json.dumps(dict_pwd)
        burst_socket.send(str_dict_pwd.encode())

        res = burst_socket.recv(1460).decode()

        print('正在burst用户:' + dict_pwd['username'] + '  尝试密码:' + dict_pwd['password'])
        print()
        if res == 'pass':
            print('爆破成功!' + dict_pwd['username'] + dict_pwd['password'])
            burst_socket.close()
            flag = False
            break
        else:
            print('burst失败...' + '尝试密码为:' + dict_pwd['password'])

    # 如果字典可用,跳出循环
    if flag == False:
        break

    # 否则终止程序!
    else:
        print('未能使用此字典进行破解,请重新选择字典!')
        burst_socket.close()
        os._exit(0)



# 向client发送burst后的密码
burst_server_socket = socket.socket()
burst_server_socket.bind(('127.0.0.1',10140))
# 设置端口重用
burst_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
burst_server_socket.listen()

print('--------等待getpwd--------')
conn,addr = burst_server_socket.accept()
print(addr[0] + '主机以上线')

conn.send(dict_pwd['username'].encode())
print('用户名已发送!')
time.sleep(0.5)
# 防止tcp的黏包,设置缓冲时间
conn.send(dict_pwd['password'].encode())
print('密码已发送!')
conn.close()
burst_server_socket.close()
# 客户端client
import socket
import json

get_pwd = socket.socket()
get_pwd.connect(('127.0.0.1',10140))

print('等待burst发送password......')
username = get_pwd.recv(1460).decode()
password = get_pwd.recv(1460).decode()
print('用户名:' + username + '密码:' + password)

get_pwd.close()



# 实例化socket对象
client_socket = socket.socket()
# 与服务器建立连接
client_socket.connect(('127.0.0.1',10310))


# 客户端登录函数
def SingIn():
    username = input('请输入用户名:').strip()
    password = input('请输入密码:').strip()
    # 将用户名和密码构成字典并发送到服务端
    user_dict = {'username' : username, 'password' : password}
    # 发送前先将用户信息字典序列化为字符串
    str_user_dict = json.dumps(user_dict)
    client_socket.send(str_user_dict.encode())

# 客户端与服务端通信函数
def Talk():
    while True:
        client_message = input('----->')
        client_socket.send(client_message.encode())
        if client_message == 'q':
            print('已与服务端断开连接!')
            return

        server_message = client_socket.recv(1460)
        if server_message == b'q':
            client_socket.close()
            print('已与服务端断开连接!')
            return
        print(server_message.decode())



# 先打印客户端发送的信息
print(client_socket.recv(1460).decode())

while True:
    # 执行登录函数
    SingIn()
    # 查看登录的结果
    res = client_socket.recv(1460).decode()

    if res == 'pass':
        print('登陆成功!')
        Talk()
        break
    else:
        print('账号或密码错误!请重新输入!')

client_socket.close()

演示:
tip:由于是字典破解,所以需要自定义一个字典文件,里面存入事先定义好的密码字符串。
在这里插入图片描述

题目三:认证审计系统

1、 设计一个信息系统,系统必须通过客户端录入账号口令远程登录;
2、 系统内至少包含三个以上账号;
3、 某账号登录后服务器端可实时显示该账号登录的时间及 IP 信息;
4、 服务器端可查询账号的历史登录信息。

# 服务端server
import socketserver
import socket
import json
import time

# 服务器用户信息数据库
user_db = {'xiaohuihui':'666666','jige':'888888','xiaopengpeng':'777777'}

print('等待主机连接......')
# 定义TargetServer类,允许tcp的并发连接
class TargetServer(socketserver.BaseRequestHandler):
    # 定义父类的句柄方法
    def handle(self):
        # 实现自定义的逻辑

        print('IP为{}的客户端已连接,端口为{}'.format(self.client_address[0],self.client_address[1]))
        server_info = ('''
                           --------  欢迎来到112信息管理系统  --------
                       ''')
        # 发送上述消息
        self.request.send(server_info.encode())

        while True:
            # 接收用户名和密码并打印
            client_res = self.Server_Recv()
            self.Client_Info(client_res)

            # 执行验证程序,向客户端发送登录结果
            if self.Login(client_res) == 'pass':
                self.request.send('pass'.encode())

                # 验证通过,打印当前时间
                print(time.ctime())
                # 将成功登录的用户信息写入日志文件
                with open(r'F:\代码\课程设计\3、认证审计系统\login_log.txt',mode='a+',encoding='utf-8') as fp:
                    fp.write('登录IP:' + self.client_address[0] + ' 登录端口:' + str(self.client_address[1]) +
                             ' 登录时间:' + time.ctime() + ' 用户名:' + client_res['username'] + '\n')

                # 验证通过,可以与服务端进行socket通信
                self.Talk()
                break
            # 用户名或密码错误则断开连接
            else:
                self.request.send('fall'.encode())
                print('账户密码不匹配,已断开连接!')

        print('等待新主机连接中......')



    # 服务器接收用户名和密码的函数
    def Server_Recv(self):
        user_info = self.request.recv(1460)
        str_user_info = user_info.decode()
        return json.loads(str_user_info)

    # 服务端内打印用户名和密码的函数
    def Client_Info(self,client_res):
        print('客户端登陆成功:')
        for i in client_res:
            print(i + ':' +client_res[i])

    # 登录验证的函数
    def Login(self,client_res):
        for j in user_db:
            if (j == client_res['username']) and (user_db[j] == client_res['password']):
                return 'pass'

    # 客户端与服务端通信函数
    def Talk(self):
        while True:
            # 接收客户端的消息
            clinet_message = self.request.recv(1460)
            if clinet_message == (b'q'):
                print('已与客户端断开连接!')
                return
            # 客户端若未发送消息直接断开连接,则服务端终止停止通信
            if len(clinet_message) == 0:
                print('客户端已经断开!')
                return
            print(clinet_message.decode())

            # 服务端发消息
            server_message = input('----->')
            self.request.send(server_message.encode())
            if server_message == 'q':
                print('已与客户端断开连接!')
                return


# 实例化socketserver对象server_socket
server_socket = socketserver.ThreadingTCPServer(('127.0.0.1',10310),TargetServer)
# 循环调用
server_socket.serve_forever()
# 客户端client
import socket
import json



# 实例化socket对象
client_socket = socket.socket()
# 与服务器建立连接
client_socket.connect(('127.0.0.1',10310))


# 客户端登录函数
def SingIn():
    username = input('请输入用户名:').strip()
    password = input('请输入密码:').strip()
    # 将用户名和密码构成字典并发送到服务端
    user_dict = {'username' : username, 'password' : password}
    # 发送前先将用户信息字典序列化为字符串
    str_user_dict = json.dumps(user_dict)
    client_socket.send(str_user_dict.encode())

# 客户端与服务端通信函数
def Talk():
    while True:
        client_message = input('----->')
        client_socket.send(client_message.encode())
        if client_message == 'q':
            print('已与服务端断开连接!')
            return

        server_message = client_socket.recv(1460)
        if server_message == b'q':
            client_socket.close()
            print('已与服务端断开连接!')
            return
        print(server_message.decode())


# 先打印客户端发送的信息
print(client_socket.recv(1460).decode())

while True:
    # 执行登录函数
    SingIn()
    # 查看登录的结果
    res = client_socket.recv(1460).decode()

    if res == 'pass':
        print('登陆成功!')
        Talk()
        break
    else:
        print('账号或密码错误!请重新输入!')

client_socket.close()

演示:
tip:操作文件函数时,注意要将path写为绝对路径,写相对路径偶尔会出问题。在这里插入图片描述

题目四:数据嗅探系统

1、 设计一个信息系统,系统必须通过客户端录入账号口令远程登录;
2、 登录后客户端可通过键盘输入向服务器发送数据;
3、 服务器端设置嗅探关键字,如果客户端发送的数据包含该关键字,即将该数据显示出来。

#
import socketserver
import socket
import json

# 服务器用户信息数据库
user_db = {'xiaohuihui':'666666','jige':'888888','xiaopengpeng':'777777'}

print('等待主机连接......')
# 定义TargetServer类,允许tcp的并发连接
class TargetServer(socketserver.BaseRequestHandler):
    # 定义父类的句柄方法
    def handle(self):
        # 实现自定义的逻辑

        print('IP为{}的客户端已连接,端口为{}'.format(self.client_address[0],self.client_address[1]))
        server_info = ('''
                           --------  欢迎来到112信息管理系统  --------
                       ''')
        # 发送上述消息
        self.request.send(server_info.encode())

        while True:
            # 接收用户名和密码并打印
            client_res = self.Server_Recv()

            # 执行验证程序,向客户端发送登录结果
            if self.Login(client_res) == 'pass':
                self.request.send('pass'.encode())
                print('客户端已成功登录!')
                # 验证通过,可以与服务端进行socket通信
                self.Talk()
                break
            # 用户名或密码错误则断开连接
            else:
                self.request.send('fall'.encode())
                print('账户密码不匹配,已断开连接!')

        print('等待新主机连接中......')



    # 服务器接收用户名和密码的函数
    def Server_Recv(self):
        user_info = self.request.recv(1460)
        str_user_info = user_info.decode()
        return json.loads(str_user_info)


    # 登录验证的函数
    def Login(self,client_res):
        for j in user_db:
            if (j == client_res['username']) and (user_db[j] == client_res['password']):
                return 'pass'

    # 客户端与服务端通信函数
    def Talk(self):
        while True:
            # 接收客户端的消息
            clinet_message = self.request.recv(1460)
            if clinet_message == (b'q'):
                print('已与客户端断开连接!')
                return
            # 客户端若未发送消息直接断开连接,则服务端终止停止通信
            if len(clinet_message) == 0:
                print('客户端已经断开!')
                return
            # 对客户端发送的敏感关键词进行捕获并打印
            if "密码" in clinet_message.decode():
                print('成功捕获嗅探到关键词:密码!')
                print(clinet_message.decode())


# 实例化socketserver对象server_socket
server_socket = socketserver.ThreadingTCPServer(('127.0.0.1',10310),TargetServer)
# 循环调用
server_socket.serve_forever()
# client 客户端
import socket
import json

# 实例化socket对象
client_socket = socket.socket()
# 与服务器建立连接
client_socket.connect(('127.0.0.1',10310))


# 客户端登录函数
def SingIn():
    username = input('请输入用户名:').strip()
    password = input('请输入密码:').strip()
    # 将用户名和密码构成字典并发送到服务端
    user_dict = {'username' : username, 'password' : password}
    # 发送前先将用户信息字典序列化为字符串
    str_user_dict = json.dumps(user_dict)
    client_socket.send(str_user_dict.encode())

# 客户端与服务端通信函数
def Talk():
    while True:
        client_message = input('----->')
        client_socket.send(client_message.encode())
        if client_message == 'q':
            print('已与服务端断开连接!')
            return



# 先打印客户端发送的信息
print(client_socket.recv(1460).decode())

while True:
    # 执行登录函数
    SingIn()
    # 查看登录的结果
    res = client_socket.recv(1460).decode()

    if res == 'pass':
        print('登陆成功!')
        Talk()
        break
    else:
        print('账号或密码错误!请重新输入!')

client_socket.close()

演示:
在这里插入图片描述

题目五:防火墙系统

1、 设计一个信息系统,系统必须通过客户端录入账号口令远程登录;
2、 系统内至少包含三个以上账号;
3、 系统服务器端可设定禁止登录的 IP 地址和账号信息;
4、 如果客户端从禁止的 IP 地址登录或使用禁止的账号登录则显示不允许登录,并断开连接。

# 服务端server
import socketserver
import socket
import json

# 服务器用户信息数据库
user_db = {'xiaohuihui':'666666','jige':'888888','xiaopengpeng':'777777'}

print('等待主机连接......')
# 定义TargetServer类,允许tcp的并发连接
class TargetServer(socketserver.BaseRequestHandler):
    # 定义父类的句柄方法
    def handle(self):
        # 实现自定义的逻辑

        print('IP为{}的客户端已连接,端口为{}'.format(self.client_address[0],self.client_address[1]))
        server_info = ('''
                           --------  欢迎来到112信息管理系统  --------
                       ''')
        # 发送上述消息
        self.request.send(server_info.encode())

        while True:
            # 接收用户名和密码并打印
            client_res = self.Server_Recv()
            self.Client_Info(client_res)


            # 执行验证程序,向客户端发送登录结果
            if self.Login(client_res) == 'pass':
                self.request.send('pass'.encode())

                # 验证通过,可以与服务端进行socket通信
                self.Talk()
                break
            # 如果用户符合防火墙策略,那么返回404
            elif self.Login(client_res) == '404':
                self.request.send('404'.encode())
                print('客户端IP或登录用户名为防火墙黑名单!')
            # 用户名或密码错误则断开连接
            else:
                self.request.send('fall'.encode())
                print('账户密码不匹配,已断开连接!')

        print('等待新主机连接中......')


    # 服务器接收用户名和密码的函数
    def Server_Recv(self):
        user_info = self.request.recv(1460)
        str_user_info = user_info.decode()
        return json.loads(str_user_info)

    # 服务端内打印用户名和密码的函数
    def Client_Info(self,client_res):
        print('客户端登陆成功:')
        for i in client_res:
            print(i + ':' +client_res[i])

    # 登录验证的函数
    def Login(self,client_res):
        # 设定被拒绝的ACL字典
        deny_user = {'IP': '127.0.0.1', 'user': 'xiaohuihui'}
        # 满足ACL,则返回错误代码,拒绝登录!
        if (self.client_address[0] == deny_user['IP']) and (client_res['username'] == deny_user['user']):
            return '404'
        for j in user_db:
            if (j == client_res['username']) and (user_db[j] == client_res['password']):
                return 'pass'


    # 客户端与服务端通信函数
    def Talk(self):
        while True:
            # 接收客户端的消息
            clinet_message = self.request.recv(1460)
            if clinet_message == (b'q'):
                print('已与客户端断开连接!')
                return
            # 客户端若未发送消息直接断开连接,则服务端终止停止通信
            if len(clinet_message) == 0:
                print('客户端已经断开!')
                return
            print(clinet_message.decode())

            # 服务端发消息
            server_message = input('----->')
            self.request.send(server_message.encode())
            if server_message == 'q':
                print('已与客户端断开连接!')
                return

# 实例化socketserver对象server_socket
server_socket = socketserver.ThreadingTCPServer(('127.0.0.1',10310),TargetServer)
# 循环调用
server_socket.serve_forever()
# 客户端client
import socket
import json

# 实例化socket对象
client_socket = socket.socket()
# 与服务器建立连接
client_socket.connect(('127.0.0.1',10310))


# 客户端登录函数
def SingIn():
    username = input('请输入用户名:').strip()
    password = input('请输入密码:').strip()
    # 将用户名和密码构成字典并发送到服务端
    user_dict = {'username' : username, 'password' : password}
    # 发送前先将用户信息字典序列化为字符串
    str_user_dict = json.dumps(user_dict)
    client_socket.send(str_user_dict.encode())

# 客户端与服务端通信函数
def Talk():
    while True:
        client_message = input('----->')
        client_socket.send(client_message.encode())
        if client_message == 'q':
            print('已与服务端断开连接!')
            return

        server_message = client_socket.recv(1460)
        if server_message == b'q':
            client_socket.close()
            print('已与服务端断开连接!')
            return
        print(server_message.decode())


# 先打印客户端发送的信息
print(client_socket.recv(1460).decode())

while True:
    # 执行登录函数
    SingIn()
    # 查看登录的结果
    res = client_socket.recv(1460).decode()

    if res == 'pass':
        print('登陆成功!')
        Talk()
        break
    # 如果客户端接收到错误代码,那么重新执行循环,即重新登录
    if res == '404':
        print('服务器拒绝您的连接!')
        print('请重新选择账户或者IP登录!')
        continue
    else:
        print('账号或密码错误!请重新输入!')

client_socket.close()

演示:
在这里插入图片描述

题目六:加密传输系统

1、 设计客户端程序向服务器端发送数据;
2、 客户端从键盘输入的数据在发送之前进行加密,加密方法可选择仿射、移位密码;
3、 服务器端接收到数据后进行显示,然后在解密后再次显示。

# 服务端server
import socketserver
import socket
import json

# 服务器用户信息数据库
user_db = {'xiaohuihui':'666666','jige':'888888','xiaopengpeng':'777777'}

print('等待主机连接......')
# 定义TargetServer类,允许tcp的并发连接
class TargetServer(socketserver.BaseRequestHandler):
    # 定义父类的句柄方法
    def handle(self):
        # 实现自定义的逻辑

        print('IP为{}的客户端已连接,端口为{}'.format(self.client_address[0],self.client_address[1]))
        server_info = ('''
                           --------  欢迎来到112信息管理系统  --------
                       ''')
        # 发送上述消息
        self.request.send(server_info.encode())

        while True:
            # 接收用户名和密码并打印
            client_res = self.Server_Recv()
            self.Client_Info(client_res)

            # 执行验证程序,向客户端发送登录结果
            if self.Login(client_res) == 'pass':
                self.request.send('pass'.encode())

                # 验证通过,可以与服务端进行socket通信
                self.Talk()
                break
            # 用户名或密码错误则断开连接
            else:
                self.request.send('fall'.encode())
                print('账户密码不匹配,已断开连接!')

        print('等待新主机连接中......')


    # 服务器接收用户名和密码的函数
    def Server_Recv(self):
        user_info = self.request.recv(1460)
        str_user_info = user_info.decode()
        return json.loads(str_user_info)

    # 服务端内打印用户名和密码的函数
    def Client_Info(self,client_res):
        print('客户端登陆成功:')
        # 解密过程
        print('username' + ':' + client_res['username'][-1::-1])
        print('password' + ':' + client_res['password'][:-4])

    # 登录验证的函数
    def Login(self,client_res):
        for j in user_db:
            # 比对经过加密后的数据进行身份验证
            if (j[-1::-1] == client_res['username']) and (user_db[j] + '1014' == client_res['password']):
                return 'pass'

    # 客户端与服务端通信函数
    def Talk(self):
        while True:
            # 接收客户端的消息
            clinet_message = self.request.recv(1460)
            if clinet_message == (b'q'):
                print('已与客户端断开连接!')
                return
            if len(clinet_message) == 0:
                print('客户端已经断开!')
                return
            # 反转打印客户端发来的消息
            print(clinet_message.decode()[-1::-1])

            # 将输入的信息反转后发送
            server_message = input('----->')[-1::-1]
            self.request.send(server_message.encode())
            if server_message == 'q':
                print('已与客户端断开连接!')
                return


# 实例化socketserver对象server_socket
server_socket = socketserver.ThreadingTCPServer(('127.0.0.1',10310),TargetServer)
# 循环调用
server_socket.serve_forever()
# 客户端client
import socket
import json

# 实例化socket对象
client_socket = socket.socket()
# 与服务器建立连接
client_socket.connect(('127.0.0.1',10310))


# 客户端登录函数
def SingIn():
    username = input('请输入用户名:').strip()
    password = input('请输入密码:').strip()
    # 将用户名和密码构成字典并发送到服务端
    user_dict = {'username' : username, 'password' : password}

    # 将客户端输入的用户名反转,密码加1014然后发送
    user_dict['username'] = username[-1::-1]
    user_dict['password'] = password + '1014'
    # 发送前先将用户信息字典序列化为字符串
    str_user_dict = json.dumps(user_dict)
    client_socket.send(str_user_dict.encode())

# 客户端与服务端通信函数
def Talk():
    while True:
        # 将输入的信息反转后发送
        client_message = input('----->')[-1::-1]
        client_socket.send(client_message.encode())
        if client_message == 'pass':
            print('已与服务端断开连接!')
            return

        server_message = client_socket.recv(1460)
        if server_message == b'q':
            client_socket.close()
            print('已与服务端断开连接!')
            return
        # 反转打印服务端发来的消息
        print(server_message.decode()[-1::-1])


# 先打印客户端发送的信息
print(client_socket.recv(1460).decode())

while True:
    # 执行登录函数
    SingIn()
    # 查看登录的结果
    res = client_socket.recv(1460).decode()

    if res == 'pass':
        print('登陆成功!')
        Talk()
        break
    else:
        print('账号或密码错误!请重新输入!')

client_socket.close()

演示:
在这里插入图片描述

题目七:图形验证模拟

要求:
1、开发一个手机锁屏的图形验证程序,以字符命令行形式来实现要求完成的功能有如下:
2、 登录时输入用户名;
3、 输入 4*4 坐标下的图形点位置,用字符方式输入;
4、 输入完成后实现在服务器端对图形进行验证;
5、 至少有三个以上的用户验证。

# 服务端server
import socket
import time

# 服务器用户信息数据库
user_db = {'xiaohuihui':'12342234','jige':'11223344','cxp':'44444444'}
# 将数据库字典的键取出来,构成一个可迭代对象
user_key = user_db.keys()
user_list = []
# 将字典的键迭代存入用户名列表
for i in user_key:
    user_list.append(i)

# 实例化socket对象
server_socket = socket.socket()
# 设置端口重用
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('127.0.0.1',10310))
server_socket.listen()

conn,addr = server_socket.accept()
print('已成功连接客户端!')

# 接收用户名
user = conn.recv(1460).decode()

# 设定验证结果为空
res = ''
flag = True
while True:

    # 如果验证结果为字符串pass,则直接退出循环
    if res == 'pass':
        print('客户端验证通过!')
        break
    else:
        # 接收密码
        pwd = conn.recv(1460).decode()

    # 比对数据库信息
    for i in user_list:
        if (user == i) and (pwd == user_db[i]):
            res = 'pass'
            conn.send(res.encode())
            break
        else:
            conn.send('fall'.encode())
            print('客户端验证失败!')
            # 标记flag为False
            flag = False
            break
            
    # 如果flag等于False,那么重新开始循环,等待接收用户的输入
    if flag == False:
        continue

# 四次挥手
conn.close()
# 关闭套接字
server_socket.close()
# 客户端client
import socket
import time

# 实例化socket对象
client_server = socket.socket()
client_server.connect_ex(('127.0.0.1',10310))
print('已成功连接服务端!')


# 初始化图形字符串
init_str = '0000000000000000'
# 强转为列表,便于操作
init_list = list(init_str)
# 设定密码初值为空字符串,用于拼接输入的密码
password = ''

user = input('请输入用户名:')
client_server.send(user.encode())
time.sleep(0.5)
print('请输入验证图形')
# 打印初始化的图形
for i in range(16):
    print(init_list[i] + '\t', end='')
    if i % 4 == 3:
        print()

while True:
    print('''
            请选择输入密码还是直接输入verify验证:
            tip:使用逗号分隔开密码
         ''')
    auth = input()

    # 如果输入verify,则将密码发送至服务端进行验证
    if auth == 'verify':
        client_server.send(password.encode())
        res = client_server.recv(1460).decode()
        # 如果通过,则退出循环
        if res == 'pass':
            print('验证成功!')
            break
        # 如果不通过,初始化图形,并重新进入循环等待用户输入
        else:
            password = ''
            init_str = '0000000000000000'
            init_list = list(init_str)
            print('账号或密码错误,请重新登录!')
            continue

    # 如果输入密码
    else:
        # 将输入的逗号去除掉,返回一个元素为字符串的列表
        pwd_section = auth.split(',')
        # 将列表中的字符串元素拼接为一个完整的字符串,赋值给password
        password += ''.join(pwd_section)

        # num_1为行数算法
        num_1 = (int(pwd_section[0]) - 1) * 4
        # num_2为列数算法
        num_2 = int(pwd_section[1]) + num_1

        # 将输入的点坐标改为x
        init_list[num_2 - 1] = 'x'
        # 打印输出修改后的图形
        for i in range(16):
            print(init_list[i] + '\t', end='')
            if i % 4 == 3:
                print()

client_server.close()

演示:
在这里插入图片描述

写在最后

       第一次尝试写博客,希望自己以后能爱上这里,多和大家分享学习心得。另外,以上代码各位在用来学习或者用来填写实验报告时,可以加入自己的逻辑并修改和完善它,尽管我完善代码的时间远大于写出实现要求代码的时间,但我知道这里面还是有很多瑕疵和值得改进的地方,对代码哪里有疑问,或者有建议的朋友,欢迎讨论区见。

  • 16
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
摘 要 随着Internet和计算机网络技术的蓬勃发展,网络安全问题现在已经得到普遍重视。网络防火墙系统就是网络安全技术在实际中的应用之一。防火墙的核心思想是在不安全的网际网环境中构造一个相对安全的子网环境。运行在系统上的网络应用软件在访问网络时,都必须经过防火墙的确认,从而达到控制用户计算机和Internet之间的连接目的。本文首先简要介绍了防火墙的原理,然后叙述了防火墙的分类,接着从实现信息安全的角度运用JAVA程序实现代理防火墙的设计。 关键词:防火墙;包过滤;代理防火墙;网络安全;防火墙技术原理。 一、前言 近年来,随着普通计算机用户群的日益增长,“防火墙”一词已经不再是服务器领域的专署,大部分家庭用户都知道为自己爱机安装各种“防火墙”软件了。但是,并不是所有用户都对“防火墙”有所了解的,一部分用户甚至认为,“防火墙”是一种软件的名称……时光飞梭,随着计算机和网络的发展,各种攻击入侵手段也相继出现了,为了保护计算机的安全,人们开发出一种能阻止计算机之间直接通信的技术,并沿用了古代类似这个功能的名字——“防火墙”技术来源于此。用专业术语来说,防火墙是一种位于两个或多个网络间,实施网络之间访问控制的组件集合。对于普通用户来说,所谓“防火墙”,指的就是一种被放置在自己的计算机与外界网络之间的防御系统,从网络发往计算机的所有数据都要经过它的判断处理后,才会决定能不能把这些数据交给计算机,一旦发现有害数据,防火墙就会拦截下来,实现了对计算机的保护功能。防火墙技术从诞生开始,就在一刻不停的发展着,各种不同结构不同功能的防火墙,构筑成网络上的一道道防御大堤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值