假期有点无聊,搞个密码管理器,做个记录
Here: repository link
#简介
头脑一热做的一个小项目,要实现的功能大致如下:
- 登陆口令(称为口令,防止与后面的“密码”混淆)验证
- 添加密码条目
- app/站点名称
- 账号/邮箱
- 密码
- 添加时间(程序自动生成)
- 密码加密
- 密码条目存储
- 密码条目查询
- 按app/站点名称
- 按账号/邮箱
- 更新/删除存储的密码条目
- 先获取密码条目在数据库中的ID作为参数——
偷懒行为 - 显示对应密码条目后进行删除确认(2022.3)
- 先获取密码条目在数据库中的ID作为参数——
- 修改登陆口令
- (2022.1)新增密码生成,获取用户输入的密码长度数值,随机生成包括大小写字母、数字、符号的乱码作为强密码
交互的话先弄成命令行程序 已改用curses库实现
#各功能简介
#登陆口令设置、验证及修改
实现方法很简单了:
第一次启动程序要求设置一个登陆口令,重复输入检查无误后,hash加密,存储到数据库里。之后登陆对输入的密码进行校验即可。
设置登陆口令以及后续使用时输入口令需要对输入内容进行隐藏
用getpass库:
1
2import getpass
pwd = getpass.getpass("[PASSWROD]: ") # hide input改用curses库后直接用curses.noecho()实现即可
#python curses库使用
不开坑,不填坑,官方DOC放在这算了,都是很简单的操作
#密码加解密,密码条目增删、更新及查询
由于hash加密的不可逆性,这里无法使用,因为后面还要查询密码并显示,所以需要寻找一种可逆的加密方法。偷个懒,直接平移ASCII码,偏移量选为当前时间的秒数+15,模拟一个随机加密。自然解密就是反向平移。
1 | # offset functions。 only one is enough actually, with changing offset value |
添加和更新密码时的密码输入没有隐藏,也算是偷个懒吧,毕竟有些比较复杂的密码输错了要重新输两遍甚至多遍难免会烦。
添加密码时,在输入站点和账户后对数据库中已有条目进行查询,若发现有同站点同账户密码条目询问是否停止添加转而更新密码。这里匹配方式为:站点信息完全相同,账户信息不区分大小。
sqlite3进行正则搜索遇到了点困难,翻了好久文档也没弄出个方法,最后选择基于StackOverflow中的一个方法完成。密码条目查询正则匹配设置大小写不敏感,即将上述解法中正则表达式定义改为:
1 | reg = re.compile(expr, re.I) |
其余的内容就是数据库的操作了,放在这当备用吧
1 | import sqlite3 |
#To Do
上面提到了一部分,随时想起什么再写上放这里,咕咕咕
-
GUI改用curses库了 -
搜索功能使用正则匹配已完成 -
重复密码条目添加时进行提示与引导 -
又想起来一个,curses库只能在限定面板内显示查询结果,这样在对账号(邮箱)进行查询时,由于查询结果很多,可能由于终端面积不足而导致curses库运行出错用curses pad解决了