期末大作业 个人口令管理系统(密码学)
个人口令管理系统
这篇博客呢,主要是记录自己完成密码学大作业的一个记录,以后忘了还可以翻开自己的博客来看看,非常不错哈哈。(这只是包含了非常基本的功能,各位大佬见怪不怪请多指教!)
系统的登录界面:
课程大作业的设计要求:设计一款个人口令管理软件,实现用户登录、帮助用户管理各种敏感信息(如个人资料、信用卡、WiFi密码等信息)、支持自动生成强口令、实现安全地与任何人共享口令等功能。
需要解决的问题:
(一)连接数据库,来保存系统的登录信息、口令管理信息。
import pymysql
db = pymysql.connect(host='localhost', port=3306, user='root', password='xxxx', database='crypt', charset='utf8')
如果没有安装pymysql,可以直接:pip install pymysql
(二)设计登录主界面
# 这是系统的登录界面
import tkinter
from tkinter import messagebox
import signature as sign
import pymysql
import manage
class Login(object):def __init__(self):# 创建主窗口,用于容纳其它组件self.root = tkinter.Tk()# 给主窗口设置标题内容self.root.title("无忧个人口令管理系统")self.root.geometry('800x500')self.canvas = tkinter.Canvas(self.root, height=500, width=800) # 创建画布self.image_file = tkinter.PhotoImage(file="login.png") # 加载图片文件self.image = self.canvas.create_image(0,0, anchor='nw', image=self.image_file)#将图片置于画布上self.canvas.pack(side='top') # 放置画布(为上端)# 创建一个`label`名为`账户: `self.label_account = tkinter.Label(self.root, text='账户')# 创建一个`label`名为`密码: `self.label_password = tkinter.Label(self.root, text='密码')# 创建一个账号输入框,并设置尺寸self.input_account = tkinter.Entry(self.root, width=30)# 创建一个密码输入框,并设置尺寸self.input_password = tkinter.Entry(self.root, show='*',width=30)# 创建系统名称:个人口令管理系统self.big_title = self.canvas.create_text(390, 120, text='无忧个人口令管理系统',font=('楷体', 40),fill='black')# 创建一个登录系统的按钮self.login_button = tkinter.Button(self.root, command = self.backstage_interface, text="登录", width=10)# 创建一个注册系统的按钮self.siginUp_button = tkinter.Button(self.root, command = self.siginUp_interface, text="注册", width=10)# 完成布局def gui_arrang(self):self.label_account.place(relx=0.35, rely= 0.4)self.label_password.place(relx=0.35, rely= 0.5)self.input_account.place(relx=0.4, rely=0.4)self.input_password.place(relx=0.4, rely=0.5)self.login_button.place(relx=0.4, rely=0.6)self.siginUp_button.place(relx=0.55, rely=0.6)self.root.mainloop()# 进入注册界面def siginUp_interface(self):self.root.destroy()# tkinter.messagebox.showinfo(title='测试系统', message='进入注册界面')sign.main()# 进行登录信息验证,验证账户密码是否正确def backstage_interface(self):db = pymysql.connect(host='localhost', port=3306, user='root', password='1234567890', database='crypt', charset='utf8') # 1234567890cursor = db.cursor()id = self.input_account.get()passw = self.input_password.get()sql1 = "select id from user where id='%s' and password='%s'" % (id, passw)cursor.execute(sql1)result = cursor.fetchone()# 判断用户名或密码不能为空if not (id and passw):tkinter.messagebox.showwarning(title='警告', message='账号或密码不能为空')if result:tkinter.messagebox.showinfo(title='欢迎您', message=' 登录成功!\r\n当前登录账号为:' + id)db.commit()self.root.destroy()manage.main()if db.open:db.close()else:tkinter.messagebox.showerror(title='错误', message='账号或密码错误!')def main():# 初始化对象L = Login()# 进行布局L.gui_arrang()if __name__ == '__main__':main()
可以进行账号密码的登录。
(三)设计注册界面
#这是系统的注册界面
import tkinter
from tkinter import messagebox
import pymysqlclass Sign(object):def __init__(self):self.root = tkinter.Tk()self.root.title("注册")self.root.geometry('700x400')self.canvas = tkinter.Canvas(self.root, height=400, width=700)self.image_file = tkinter.PhotoImage(file="login.png")self.image = self.canvas.create_image(0, 0, anchor='nw', image=self.image_file)self.canvas.pack(side='top')self.account = tkinter.Label(self.root, text='账户:')self.account_e = tkinter.Entry(self.root, width=30)self.password = tkinter.Label(self.root, text='密码:')self.password_e = tkinter.Entry(self.root, show='*', width=30)self.again = tkinter.Label(self.root, text='确认密码:')self.again_e = tkinter.Entry(self.root, show='*', width=30)self.sign_button = tkinter.Button(self.root, command=self.sign_ok, text="确定", width=10)self.exit = tkinter.Button(self.root, command=self.root.quit, text="取消", width=10)def gui_arrang(self):self.account.place(relx=0.3, rely=0.2)self.password.place(relx=0.3,rely=0.3)self.again.place(relx=0.3, rely=0.4)self.account_e.place(relx=0.4, rely=0.2)self.password_e.place(relx=0.4, rely=0.3)self.again_e.place(relx=0.4, rely=0.4)self.sign_button.place(relx=0.4,rely=0.5)self.exit.place(relx=0.6, rely=0.5)self.root.mainloop()def id_write(self, id, password):db = pymysql.connect(host='localhost', port=3306, user='root', password='1234567890', database='crypt', charset='utf8')cursor = db.cursor()sql1 = "select id from user where id='%s'" % (id)sql2 = "insert into user values(%s,'%s')" % (id, password)cursor.execute(sql1)result = cursor.fetchone()if result: # 能够在表中查询到数据tkinter.messagebox.showerror(title='错误', message='该账号已被注册,请重新输入!')else:cursor.execute(sql2)db.commit()db.close()tkinter.messagebox.showinfo(title='成功!', message='注册成功,请登录!')def sign_ok(self):f1 = self.password_e.get()f2 = self.again_e.get()if f1 == f2:self.id_write(self.account_e.get(), f2)else:tkinter.messagebox.showerror(title='失败', message='输入的密码不匹配!')def main():signer = Sign()signer.gui_arrang()
这是注册存储在数据库中的数据:
(四)设计登录成功后进入的功能管理界面
import tkinter
from tkinter import messagebox
import auto
import kouling
import chatclass Manage(object):def __init__(self):self.root = tkinter.Tk()self.root.title('个人口令管理系统')self.root.geometry('700x400')self.canvas = tkinter.Canvas(self.root, height=500, width=800)#创建画布self.image_file = tkinter.PhotoImage(file="kou.png")#加载图片文件self.image = self.canvas.create_image(0,0, anchor='nw', image=self.image_file)#将图片置于画布上self.canvas.pack(side='top')#放置画布(为上端)self.frame = tkinter.Frame(self.root, bd=3, relief='groove')self.manage = tkinter.Button(self.frame, command=kouling.main, bg='darkgray', text="口令管理", width=15)self.kouling = tkinter.Button(self.frame, command=auto.main, bg='darkgray', text="自动生成强口令", width=15)self.chat = tkinter.Button(self.frame, command=chat.main, bg='darkgray', text="安全会话", width=15)self.big_title = self.canvas.create_text(250, 90, text='功能选择:', font=('楷体', 25), fill='white')def gui_arrang(self):self.frame.place(relx=0.2, rely=0.3, relheight=0.3, relwidth=0.6)self.manage.place(relx=0.05, rely=0.05)self.kouling.place(relx=0.35, rely=0.05)self.chat.place(relx=0.65, rely=0.05)self.root.mainloop()def main():L = Manage()L.gui_arrang()if __name__ == '__main__':main()
(五)设计口令管理界面
import tkinter
import tkinter.ttk as ttk
import hashlib
import pymysql
import datetime
from tkinter import messageboxclass Secret(object):def __init__(self):self.root = tkinter.Tk()self.root.title('口令管理')self.root.geometry('700x600')self.l1 = tkinter.Label(self.root, text='口令管理项目', font=('楷体', 15))self.l2 = tkinter.Label(self.root, text='身份验证') self.e1 = tkinter.Entry(self.root, width=30) # labelself.l3 = tkinter.Label(self.root, text='项目名称')self.e2 = tkinter.Entry(self.root, width=30) # projectself.l4 = tkinter.Label(self.root, text='账户ID') self.e3 = tkinter.Entry(self.root, width=30) # IDself.l5 = tkinter.Label(self.root, text='密码')self.e4 = tkinter.Entry(self.root, width=30) # passwordself.b1 = tkinter.Button(self.root,command=self.tianjia, text='添加', width=10)self.b2 = tkinter.Button(self.root,command=self.chaxun, text='查询', width=10)self.b3 = tkinter.Button(self.root,command=self.xiugai, text='修改', width=10)self.b4 = tkinter.Button(self.root, command=self.delete, text='删除', width=10)self.date = str(datetime.datetime.now().strftime("%Y-%m-%d+%H时%M分%S秒"))self.db = pymysql.connect(host='localhost', port=3306, user='root', password='1234567890', database='crypt', charset='utf8')self.l = ttk.Treeview(self.root, show='headings', selectmode='extended')self.l['columns'] = ('标签', '项目名称', '账号ID', '密码', '时间')self.l.column('标签', width=140)self.l.column('项目名称', width=70)self.l.column('账号ID', width=120)self.l.column('密码', width=120)self.l.column('时间', width=140)self.l.heading('标签', text='标签')self.l.heading('项目名称', text='项目名称')self.l.heading("账号ID", text="账号ID")self.l.heading("密码", text="密码") # 主键label,idself.l.heading("时间", text="时间")self.cursor = self.db.cursor()def tuichu(self):self.cursor.close()if self.db.open:self.db.close()def tianjia(self):self.db.ping(reconnect=True)# insert into secret values('12345aa', 'test','120010','12312', '2022/12/21/22/05');sql = "select label, ID from secret where label='%s' and ID='%s'" % (self.e1.get(), self.e3.get())sql1 = "insert into secret values('%s','%s','%s','%s','%s')" % (self.e1.get(), self.e2.get(), self.e3.get(), self.e4.get(), self.date)self.cursor.execute(sql)result = self.cursor.fetchone()if result: # 表格中已经存在的。self.db.commit()tkinter.messagebox.showerror(title='错误!', message='项目已存在!')else:# 数据表中还没有self.cursor.execute(sql1)self.db.commit()tkinter.messagebox.showinfo(title='成功!', message='添加成功!')def chaxun(self):self.db.ping(reconnect=True)if self.e1.get()!='' and self.e2.get()!='':sql = "select * from secret where label='%s' and project='%s'" % (self.e1.get(), self.e2.get())else:sql = "select * from secret where label='%s'" % (self.e1.get())#print(f"self.e1.get:{self.e1.get()}")#print(f"self.secret:{self.secret}")self.cursor.execute(sql)row = self.cursor.fetchone()while row:self.l.insert('',0,values=(row[0], row[1],row[2],row[3],row[4]))row = self.cursor.fetchone()self.root.mainloop()def delete(self):self.db.ping(reconnect=True)sql = "select label, ID from secret where label='%s' and ID='%s'" % (self.e1.get(), self.e3.get())sql1 = "delete from secret where label='%s' and ID='%s'" % (self.e1.get(), self.e3.get())self.cursor.execute(sql)result = self.cursor.fetchone()if result:self.cursor.execute(sql1)self.db.commit()tkinter.messagebox.showinfo(title='成功!', message='删除成功!')else:tkinter.messagebox.showerror(title='错误!', message='项目不存在!')def xiugai(self):self.db.ping(reconnect=True)sql = "select label, ID from secret where label='%s' and ID='%s'" % (self.e1.get(), self.e3.get())sql1 = "update secret set password='%s',date='%s' where label='%s' and project='%s' and ID='%s'" % (self.e4.get(), self.date, self.e1.get(), self.e2.get(), self.e3.get())self.cursor.execute(sql)result = self.cursor.fetchone()if result:self.cursor.execute(sql1)self.db.commit()tkinter.messagebox.showinfo(title='成功!', message='修改成功!')else:tkinter.messagebox.showerror(title='错误!', message='项目不存在!')def gui_arrang(self):self.l1.place(relx=0.45, rely=0)self.l2.place(relx=0.3, rely=0.1)self.l3.place(relx=0.3, rely=0.2)self.l4.place(relx=0.3, rely=0.3)self.l5.place(relx=0.3, rely=0.4)self.e1.place(relx=0.4, rely=0.1)self.e2.place(relx=0.4, rely=0.2)self.e3.place(relx=0.4, rely=0.3)self.e4.place(relx=0.4, rely=0.4)# self.close.place(relx=0.75, rely=0.4)self.b1.place(relx=0.15, rely=0.5)self.b2.place(relx=0.3, rely=0.5)self.b3.place(relx=0.45, rely=0.5)self.b4.place(relx=0.6, rely=0.5)# self.b5.place(relx=0.75, rely=0.5)self.l.place(relx=0.075, rely=0.6)self.root.mainloop()def main():L = Secret()L.gui_arrang()L.tuichu()if __name__ == '__main__':main()
(六)设计自动生成强口令界面
import random
import re
import tkinter
import manage as Mclass auto(object):def __init__(self):self.root = tkinter.Tk()self.root.title('自动生成强口令')self.root.geometry('700x400')self.f1 = tkinter.Frame(self.root,bd=5,relief='groove')self.f2 = tkinter.Frame(self.root,bd=5,relief='groove')self.l1 = tkinter.Label(self.f1, text='1、字母')self.l2 = tkinter.Label(self.f1, text='2、字母+数字')self.l3 = tkinter.Label(self.f1, text='3、字母+数字+符号')self.l4 = tkinter.Label(self.root, text='密码类型1、2、3、')self.e1 = tkinter.Entry(self.root, width=15)self.l5 = tkinter.Label(self.root, text='账号名')self.e2 = tkinter.Entry(self.root, width=15)self.l6 = tkinter.Label(self.root, text='账户ID')self.e3 = tkinter.Entry(self.root, width=15)self.l7 = tkinter.Label(self.root, text='密码长度(7~25)')self.e4 = tkinter.Entry(self.root, width=15)self.b1 = tkinter.Button(self.root, command=self.function, text='确定', width=10)self.b2 = tkinter.Button(self.root, command=self.root.quit, text='退出', width=10)def gui_arrang(self):self.f1.place(relx=0.2, rely=0.1, relheight=0.2, relwidth=0.6)self.l1.place(relx=0.1, rely=0)self.l2.place(relx=0.1, rely=0.3)self.l3.place(relx=0.1, rely=0.6)self.l4.place(relx=0.3, rely=0.35)self.e1.place(relx=0.45, rely=0.35)self.l5.place(relx=0.3, rely=0.45)self.e2.place(relx=0.45, rely=0.45)self.l6.place(relx=0.3, rely=0.55)self.e3.place(relx=0.45, rely=0.55)self.l7.place(relx=0.3, rely=0.65)self.e4.place(relx=0.45, rely=0.65)self.b1.place(relx=0.35, rely=0.75)self.b2.place(relx=0.5, rely=0.75)self.root.mainloop()def function(self):num = self.e1.get()name = self.e2.get()id = self.e3.get()long = self.e4.get()# 字母类型englishChar = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'l', 'k', 'j', 'h', 'g', 'f', 'd', 's', 'a', 'z', 'x','c', 'v','b', 'n', 'm']# 数字类型numberChar = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']# 符号类型symbolChar = ['!', '@', '#', '$', '%', '^', '&', '*']# 生成的密码password = ''# 用户选择的密码类型allChar = []# 选择密码类型typePassword = num# 判断输入是否合法if not re.fullmatch('[1-3]', typePassword):print("\033[37;41m 不要跟我皮\033[0m")exit(0)# 初始化密码类型if typePassword.__eq__('1'):allChar = englishChar.copy()if typePassword.__eq__('2'):allChar = englishChar.copy() + numberChar.copy()if typePassword.__eq__('3'):allChar = englishChar.copy() + numberChar.copy() + symbolChar.copy()# 重新洗牌数组random.shuffle(allChar)# 配置基本信息account = nameaccountID = idpasswordLength = long# 检测用户输入是否合法if not passwordLength.isdigit() and 25 > int(passwordLength) > 7:print("\033[37;41m 不要跟我皮\033[0m")exit(0)# 循环生成密码for i in range(int(passwordLength)):a = len(allChar) - 1password = password + allChar[random.randint(0, a)]tkinter.Label(self.root, text='生成的强口令为:' + password, bg='white', width=30).place(relx=0.35, rely=0.9)print('生成的强口令为:' + password)# 密码文件备份with open('./密码/' + account, 'w', encoding='utf8') as file:file.writelines("账户ID:" + accountID + '\n')file.writelines('密码:' + password)file.close()
def main():L = auto()L.gui_arrang()
(七)设计安全会话界面
import tkinter
import tkinter.ttk as ttk
import hashlib
import pymysql
from tkinter import messageboxclass Secret(object):def __init__(self):self.root = tkinter.Tk()self.root.title('口令共享')self.root.geometry('700x600')self.l1 = tkinter.Label(self.root, text='口令共享', font=('楷体', 15))self.l2 = tkinter.Label(self.root, text='身份验证') self.e1 = tkinter.Entry(self.root, width=30) # labelself.l3 = tkinter.Label(self.root, text='账户名')self.e2 = tkinter.Entry(self.root, width=30) # projectself.l4 = tkinter.Label(self.root, text='账户ID') self.e3 = tkinter.Entry(self.root, width=30) # IDself.l5 = tkinter.Label(self.root, text='密码')self.e4 = tkinter.Entry(self.root, width=30) # passwordself.add = tkinter.Button(self.root,command=self.tianjia, text='添加', width=10)self.check = tkinter.Button(self.root,command=self.chaxun, text='查询', width=10)self.dele = tkinter.Button(self.root, command=self.delete, text='删除', width=10)self.db = pymysql.connect(host='localhost', port=3306, user='root', password='1234567890', database='crypt', charset='utf8')self.l = ttk.Treeview(self.root, show='headings', selectmode='extended')self.l['columns'] = ('标签', '项目名称', '账号ID', '密码')self.l.column('标签', width=140)self.l.column('项目名称', width=70)self.l.column('账号ID', width=120)self.l.column('密码', width=120)self.l.heading('标签', text='标签')self.l.heading('项目名称', text='项目名称')self.l.heading("账号ID", text="账号ID")self.l.heading("密码", text="密码") # 主键label,idself.cursor = self.db.cursor()# self.secret = hashlib.sha1(self.e1.get().encode('utf-8')).hexdigest()def tuichu(self):self.cursor.close()if self.db.open:self.db.close()def tianjia(self):self.secret = hashlib.sha1(self.e1.get().encode('utf-8')).hexdigest()print(f"self.e1.get:{self.e1.get()}")print(f"self.secret:{self.secret}")with open('./共享口令/' + self.e2.get(), 'w', encoding='utf8') as file:file.writelines("身份验证:" + self.e1.get() + '\n')file.writelines('hash加密:' + self.secret)file.close()self.db.ping(reconnect=True)# insert into secret values('12345aa', 'test','120010','12312', '2022/12/21/22/05');sql = "select label, ID from share where label='%s' and ID='%s'" % (self.secret, self.e3.get())sql1 = "insert into share values('%s','%s','%s','%s')" % (self.secret, self.e2.get(), self.e3.get(), self.e4.get())self.cursor.execute(sql)result = self.cursor.fetchone()if result: # 表格中已经存在的。self.db.commit()tkinter.messagebox.showerror(title='错误!', message='项目已存在!')else:# 数据表中还没有self.cursor.execute(sql1)self.db.commit()tkinter.messagebox.showinfo(title='成功!', message='添加成功!')def chaxun(self):self.db.ping(reconnect=True)if self.e1.get()!='' and self.e2.get()!='':sql = "select * from share where label='%s' and project='%s'" % (self.e1.get(), self.e2.get())else:sql = "select * from share where label='%s'" % (self.e1.get())self.cursor.execute(sql)row = self.cursor.fetchone()while row:self.l.insert('',0,values=(row[0], row[1],row[2],row[3]))row = self.cursor.fetchone()self.root.mainloop()def delete(self):self.secret = hashlib.sha1(self.e1.get().encode('utf-8')).hexdigest()self.db.ping(reconnect=True)sql = "select label, ID from share where label='%s' and project='%s' and ID='%s'" % (self.secret, self.e2.get(), self.e3.get())sql1 = "delete from share where label='%s' and ID='%s'" % (self.secret, self.e3.get())self.cursor.execute(sql)result = self.cursor.fetchone()if result:self.cursor.execute(sql1)self.db.commit()tkinter.messagebox.showinfo(title='成功!', message='删除成功!')else:tkinter.messagebox.showerror(title='错误!', message='项目不存在!')def gui_arrang(self):self.l1.place(relx=0.45, rely=0)self.l2.place(relx=0.3, rely=0.1)self.l3.place(relx=0.3, rely=0.2)self.l4.place(relx=0.3, rely=0.3)self.l5.place(relx=0.3, rely=0.4)self.e1.place(relx=0.4, rely=0.1)self.e2.place(relx=0.4, rely=0.2)self.e3.place(relx=0.4, rely=0.3)self.e4.place(relx=0.4, rely=0.4)self.add.place(relx=0.3, rely=0.5)self.check.place(relx=0.45, rely=0.5)self.dele.place(relx=0.6, rely=0.5)self.l.place(relx=0.2, rely=0.6)self.root.mainloop()def main():L = Secret()L.gui_arrang()L.tuichu()if __name__ == '__main__':main()
操作:
(1)口令管理,添加项目
(2)查询
以上是我整个系统的基本结构,(有点简单)后面还有很多其他的操作我就不展示了。
博客文章参考:(问题解决)
Python学习之tkinter–登录系统界面篇
https://blog.csdn.net/skyjingg/article/details/87883119
毕设——Python实现带GUI和连接数据库的图书管理系统!
https://blog.csdn.net/weixin_43881394/article/details/110679909
Tkinter界面设计(运动会报名系统)
https://blog.csdn.net/weixin_45062497/article/details/121346076
解决 本地计算机上的MySQL80服务启动后停止的问题!!!
https://blog.csdn.net/weixin_45042272/article/details/109412284
(如果有遗漏的,欢迎提醒指正!)
有什么问题可以在评论区留言,大家一起讨论学习呀!