​本文在CSDN"彭_Yu的博客"同步发表

 目录

1.要点

2.运行原理

3.异或算法简介

4.运行效果

5.实现过程

5.1文件结构

5.2建立数据库

5.3 Python代码


编辑

注:程序实例可到文末下载

1.要点

1.tkinter界面设计

2.SQLite数据库操作

3.字符串异或运算加密和解密

2.运行原理

1.用户需要记住一个统一的加解密密钥,对于各平台的密码,使用密钥字符串异或运算加密后存储到数据库,查询时使用同一个密钥进行密钥字符串异或解密。

2.需要注意的是,由于代码采用的是异或算法,所以密码字符串和密钥字符串不应有对应位置上相同的字符。

3.由于代码采用的是异或算法所以并不安全,他人猜到的加解密密钥与正确密钥越相似,解密出的密码也就与正确密码越相似。你可以改写加密和解密算法,实现更高级别的密码保护。

3.异或算法简介

XOR 是 exclusive OR 的缩写。英语的 exclusive 意思是"专有的,独有的",可以理解为 XOR 是更单纯的 OR 运算。

我们知道,OR 运算的运算子有两种情况,计算结果为true

(1)一个为 true,另一个为 false;
(2)两个都为 true。

上面两种情况,有时候需要明确区分,所以引入了 XOR。

XOR 排除了第二种情况,只有第一种情况(一个运算子为true,另一个为false)才会返回 true,所以可以看成是更单纯的 OR 运算。也就是说, XOR 主要用来判断两个值是否不同。

XOR 一般使用插入符号(caret)^表示。如果约定0 为 false,1 为 true,那么 XOR 的运算真值表如下。

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

4.运行效果

运行效果

编辑

5.实现过程

5.1文件结构

/根目录
-MyPWD.exe(主程序)
-MyPWD.sqlite3(数据库文件)

5.2建立数据库

在这里我们可以使用在线sqlite查看器:

在线sqlite查看器

输入如下信息:

CREATE TABLE passwords (platform TEXT, pwd TEXT, id INTEGER PRIMARY KEY)

输入信息

编辑

单击执行 sql>导出Sqlite数据库文件  并将文件重命名为 “MyPWD.sqlite3”  放入MyPWD.exe(主程序)所在目录。

单击执行 sql>导出Sqlite数据库文件

编辑

将文件重命名为 “MyPWD.sqlite3”  放入MyPWD.exe(主程序)所在目录

编辑

5.3 Python代码

import sqlite3
import tkinter
from itertools import cycle
from tkinter.ttk import Combobox
from tkinter.messagebox import showinfo, showerror, askyesno
class DatabaseAccess:
@staticmethod
def doSql(sql):
with sqlite3.connect('MyPWD.sqlite3') as conn:
conn.execute(sql)
conn.commit() @staticmethod
def getData(sql):
with sqlite3.connect('MyPWD.sqlite3') as conn:
cur = conn.cursor()
cur.execute(sql)
return cur.fetchall()
root = tkinter.Tk()
root.geometry('350x250+400+300')
root.resizable(False, False)
root.title('(C)2022彭_Yu')
lbKey = tkinter.Label(root, text='密码数据库密钥:')
lbKey.place(x=10, y=10, width=100, height=20)
key = tkinter.StringVar(root, '')
entryKey = tkinter.Entry(root, textvariable=key, show='*')
entryKey.place(x=120, y=10, width=200, height=20)
lbPlatform = tkinter.Label(root, text='平台 名称:')
lbPlatform.place(x=10, y=40, width=100, height=20)
platformName = tkinter.StringVar(root, '')
entryPlatform = tkinter.Entry(root, textvariable=platformName)
entryPlatform.place(x=120, y=40, width=200, height=20)
lbPassword = tkinter.Label(root, text='设置 密码:')
lbPassword.place(x=10, y=70, width=100, height=20)
password = tkinter.StringVar(root, '')
entryPassword = tkinter.Entry(root, textvariable=password)
entryPassword.place(x=120, y=70, width=200, height=20)
def add_modify():
if not (key.get() and platformName.get() and password.get()):
showerror('出错',
'请同时输入密码数据库密钥、平台名称、密码.\n注意:密钥不要随意更改.')
return
if key.get().isdigit():
showerror('密钥安全性出错', '为了您的密钥安全,不能使用纯数字作为密钥')
return
if sum(map(lambda x,y: x==y, password.get(), key.get())) > 0:
showerror('密钥安全性出错', '密码不合适,为了您的密钥安全,密码和密钥不能有对应位置相同的字符')
return
pwd = ''.join(map(lambda x,y: chr(ord(x)^ord(y)), password.get(), cycle(key.get())))
sql = 'SELECT * FROM passwords WHERE platform="'+platformName.get()+'"'
if len(DatabaseAccess.getData(sql)) == 1:
sql = 'UPDATE passwords SET pwd="'+pwd+'" WHERE platform="'+platformName.get()+'"'
DatabaseAccess.doSql(sql)
showinfo('恭喜请求执行成功', '修改密码成功')
else:
sql = 'INSERT INTO passwords(platform,pwd) VALUES("'+platformName.get()+'","'+pwd+'")'
DatabaseAccess.doSql(sql)
bindPlatformNames()
showinfo('恭喜请求执行成功', '增加密码成功')
btnAddModify = tkinter.Button(root,
text='增加或修改密码',
bg='cyan',
fg='black',
command=add_modify)
btnAddModify.place(x=20, y=100, width=300, height=20)
lbChoosePlatform = tkinter.Label(root, text='请选择平台:')
lbChoosePlatform.place(x=10, y=130, width=100, height=20)
def bindPlatformNames():
sql = 'SELECT platform FROM passwords'
data = DatabaseAccess.getData(sql)
data = [item[0] for item in data]
comboPlatform['values'] = data
comboPlatform = Combobox(root)
bindPlatformNames()
comboPlatform.place(x=120, y=130, width=200, height=20) lbResult = tkinter.Label(root, text='查询 结果:')
lbResult.place(x=10, y=160, width=100, height=20)
result = tkinter.StringVar(root, '')
entryResult = tkinter.Entry(root, textvariable=result)
entryResult['state'] = 'disabled'
entryResult.place(x=120, y=160, width=200,height=20)
def getPassword():
if not comboPlatform.get().strip():
showerror('出错', '还没选择平台名称')
return
if not key.get():
showerror('出错', '请输入密钥')
return
sql = 'SELECT pwd FROM passwords WHERE platform="'+comboPlatform.get()+'"'
pwd = DatabaseAccess.getData(sql)[0][0]
pwd = ''.join(map(lambda x,y: chr(ord(x)^ord(y)), pwd, cycle(key.get())))
result.set(pwd)
btnGetResult = tkinter.Button(root,
text='查询密码',
bg='cyan',
fg='black',
command=getPassword)
btnGetResult.place(x=20, y=190, width=149, height=20)
def deletePassword():
if not comboPlatform.get().strip():
showerror('出错', '您还没选择平台名称')
return
if not askyesno('请确认您的请求', '确定要删除吗?删除后不可恢复!'):
return
sql = 'DELETE FROM passwords WHERE platform="'+comboPlatform.get()+'"'
DatabaseAccess.doSql(sql)
showinfo('恭喜操作成功完成', '密码删除成功')
bindPlatformNames()
btnDelete = tkinter.Button(root, text='删除密码',
bg='red', fg='yellow',
command=deletePassword)
btnDelete.place(x=179, y=190, width=140, height=20)
root.mainloop()

然后将此程序编译为exe,当然不编译也可以但要保证 MyPWD.py 文件与 MyPWD.sqlite3 数据库文件在同一目录下。

关于如何编译请查看我以前的一篇文章,做好准备操作但不要执行其中的编译命令,而是执行以下命令(执行前请保证目录结构与以下图片对应)。

#Python #日常技巧 #功能 将Python文件编译或打包成可执行(EXE)文件_python编译成可执行文件_彭_Yu的博客-CSDN博客#Python #日常技巧 #功能 将Python文件编译或打包成可执行(EXE)文件。将Python文件编译为exe文件后,可以直接在Windows上运行,不需要再依赖Python环境,可以复制到其他电脑中直接使用,较为方便。https://blog.csdn.net/2201_75480799/article/details/128058849

做好准备操作后,执行如下代码:

cd X:\源代码
pyinstaller -F -w -i X:\源代码\icon.ico X:\源代码\MyPWD.py

目录结构

编辑

出现如下字符说明编译成功,请将根目录中 dist 文件夹中的MyPWD.exe(主程序)放入 “MyPWD.sqlite3” 所在目录。

编译成功

编辑

预祝使用顺利~

文章资源下载:

https://pan.baidu.com/s/1cW8kRcQFOF2tBBj05UZmZg

提取码:2xr7

感谢您的阅读,如觉得有用请您点赞,您的鼓励是对我的最大动力!

END

2022/12/24

联系我:pengyu717@yeah.net

#Python #密码管理器 无需再记住密码,使用Python实现个人密码管理器的更多相关文章

  1. 第一阶段——CentOS6_Python3.6.1笔记(尚学堂-Python基础快速入门)+ 【补充】麦子-Python程序入门与进阶

    虚拟机环境: 设置网络 .修改网络地址 .设置网卡为nat模式 .确保物理机启动dhcp.net服务 .编辑文件:vim /etc/sysconfig/network-scripts/ifcfg-et ...

  2. web安全:防止浏览器记住或自动填写用户名和密码(表单)的终极解决方案

    最近项目上要求做到这一点,在网上搜了一圈,发现都是不完美的,不兼容全部的浏览器,于是只能自己摸索了,最终得出了终极解决方案: 涉及: disabled 或 readonly display:none; ...

  3. Python笔记_第四篇_高阶编程_再议装饰器和再议内置函数

    1. 概述: 我们在前面用了很多的装饰器这个工具的方法.这个位置要系统的讲一下装饰器. 1.2 为什么需要装饰器. 装饰器本质是一个Python函数,它可以让其他函数在不需要任何代码变动的前提下增加额 ...

  4. 如何找回Ucenter创始人密码,账号无需修改

    UCenter 创始人的密码非常重要,忘记或丢失后,就不能进入 UCenter 进行用户和数据的管理,也会对站点造成安全隐患.由于 UCenter 的密码是采用两次 md5 加一个随机数的形式加密的, ...

  5. python之函数对象、函数嵌套、名称空间与作用域、装饰器

    一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...

  6. python 全栈开发,Day12(函数的有用信息,带参数的装饰器,多个装饰器装饰一个函数)

    函数的执行时,*打散.函数的定义时,*聚合. from functools import wraps def wrapper(f): # f = func1 @wraps(f) def inner(* ...

  7. 已禁用对分布式事务管理器(MSDTC)的网络访问。请使用组件服务管理工具启用 DTC 以便在 MSDTC 安全配置中进行网络访问。

    今天写ASP.NET程序,在网页后台的c#代码里写了个事务,事务内部对一张表进行批量插入,对另外一张表进行查询与批量插入. 结果第二张表查询后foreach迭代操作时报错:已禁用对分布式事务管理器(M ...

  8. 忘记常访问网站密码怎么办?教你如何查看浏览器已保存的密码,如何简单查看Chome浏览器保存的密码?

    利用场景: 同事或朋友外出有事,电脑未锁屏离开座位.可以利用这一间隙,查看Ta在Chrome浏览器上保存的账号密码 查看逻辑: 当我们要查看Chrome浏览器上保存的密码时,点击显示,会弹出一个对话框 ...

  9. MySQL忘记了密码登录不进去,用命令符修改新的密码重新登录的方法

    MySQL忘记了密码登录不进去,用命令符修改新的密码重新登录的方法: 1.备份my.ini 2.在my.ini字段里 [mysqld] #socket=mysql skip-grant-tables ...

  10. 第十九章——使用资源调控器管理资源(1)——使用SQLServer Management Studio 配置资源调控器

    原文:第十九章--使用资源调控器管理资源(1)--使用SQLServer Management Studio 配置资源调控器 本系列包含: 1. 使用SQLServer Management Stud ...

随机推荐

  1. mysql常用语句操作

    概述: 1.通过表结构介绍.来操作mysql常用的语法&语句: 2.现在学习下几个基本的sql语句,万变不离其宗,把基础弄扎实了其它的就很容易了 一.表结构&建表: 1.学生基础信息表 ...

  2. 日志服务化&可视化&统计化

    概述: ELK是Elasticsearch(简称es).Logstash.Kibana的简称,这三者是核心套件,但并非全部. Filebeat 日志采集工具  Logstash数据处理引擎   ela ...

  3. 用Bootstrap设计后端页面模板

    <!doctype html><html lang="zh-CN"> <head> <meta charset="utf-8&q ...

  4. kube-proxy

    1 kube-proxy报错 "--random-fully" 解决: # yum install gcc make libnftnl-devel libmnl-devel aut ...

  5. django连接ubuntu22下的mysql8

    1.安装mysql(这里就不过多赘述了) sudo apt-get install mysql-server 2.登录mysql   (1) 在 根目录/etc/mysql/debian.cnf ,使 ...

  6. python实现web应用程序(1)虚拟环境与Django

    前言 在这个系列博客中,我将使用python实现一个名为"OI笔记"的项目. 1 建立项目目录 第一步,我们先为自己的项目建立一个目录. 首先,打开终端. win+r键,然后输入c ...

  7. Git克隆项目到本地

    刚进公司实习,居然不知道Git怎么克隆项目到本地,组长丢给我一个TFS账号(Azure DevOps就是以前的TFS) 1.首先在本地选择一个文件目录,选择Git Bash Here 打开一个Git ...

  8. 1.java 开始

    WelloWorld 随便新建一个文件夹,存放代码 新建一个java文件 编写代码 编译javac java文件,生成一个class文件 运行class文件,java class 可能遇到的情况 每个 ...

  9. WinForm嵌入Web网站

    1.安装CefSharp 2.GetMac()获取用户mac地址方法 3.根据错误提示新建CEFKeyBoardHander.cs form1.cs using CefSharp; using Cef ...

  10. signature

    signature可以翻译成基调.特征标记.签名.