python-密码管理箱

假期有点无聊,搞个密码管理器,做个记录
Here: repository link

#简介

头脑一热做的一个小项目,要实现的功能大致如下:

  • 登陆口令(称为口令,防止与后面的“密码”混淆)验证
  • 添加密码条目
    • app/站点名称
    • 账号/邮箱
    • 密码
    • 添加时间(程序自动生成)
  • 密码加密
  • 密码条目存储
  • 密码条目查询
    • 按app/站点名称
    • 按账号/邮箱
  • 更新/删除存储的密码条目
    • 先获取密码条目在数据库中的ID作为参数——偷懒行为
    • 显示对应密码条目后进行删除确认(2022.3)
  • 修改登陆口令
  • (2022.1)新增密码生成,获取用户输入的密码长度数值,随机生成包括大小写字母、数字、符号的乱码作为强密码

交互的话先弄成命令行程序 已改用curses库实现

#各功能简介

#登陆口令设置、验证及修改

实现方法很简单了:

第一次启动程序要求设置一个登陆口令,重复输入检查无误后,hash加密,存储到数据库里。之后登陆对输入的密码进行校验即可。

设置登陆口令以及后续使用时输入口令需要对输入内容进行隐藏

  1. 用getpass库:

    1
    2
    import getpass
    pwd = getpass.getpass("[PASSWROD]: ") # hide input
  2. 改用curses库后直接用curses.noecho()实现即可

#python curses库使用

不开坑,不填坑,官方DOC放在这算了,都是很简单的操作

#密码加解密,密码条目增删、更新及查询

由于hash加密的不可逆性,这里无法使用,因为后面还要查询密码并显示,所以需要寻找一种可逆的加密方法。偷个懒,直接平移ASCII码,偏移量选为当前时间的秒数+15,模拟一个随机加密。自然解密就是反向平移。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# offset functions。 only one is enough actually, with changing offset value
def enascii(num: int, offset: int) -> int:
if num - offset >= 33:
return num - offset
else:
return 93 + num - offset

def deascii(num: int, offset: int) -> int:
if num + offset <= 126:
return num + offset
else:
return num + offset - 93

# encryption
def encrypt(psw: str, offset: int) -> str:
encrypt_num = []
for i in psw:
encrypt_num.append(enascii(ord(i), offset + 15))
encrypted = [chr(a) for a in encrypt_num]
return "".join(encrypted)

# decryption, s as encrypted password string
def decrypt(s: str, offset: int) -> str:
pwd = [chr(deascii(ord(a), offset + 15)) for a in s]
return "".join(pwd)

添加和更新密码时的密码输入没有隐藏,也算是偷个懒吧,毕竟有些比较复杂的密码输错了要重新输两遍甚至多遍难免会烦。

添加密码时,在输入站点和账户后对数据库中已有条目进行查询,若发现有同站点同账户密码条目询问是否停止添加转而更新密码。这里匹配方式为:站点信息完全相同,账户信息不区分大小。

sqlite3进行正则搜索遇到了点困难,翻了好久文档也没弄出个方法,最后选择基于StackOverflow中的一个方法完成。密码条目查询正则匹配设置大小写不敏感,即将上述解法中正则表达式定义改为:

1
reg = re.compile(expr, re.I)

其余的内容就是数据库的操作了,放在这当备用吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import sqlite3
db = sqlite3.connect("database.db")
cur = db.cursor()
cur.execute() # commands here
result1 = cur.fetchall()
result2 = cur.fetchone()
db.commit()
db.close()

create_command = """CREATE TABLE (table) ..."""
add_command = """INSERT INTO (table) (cols) VALUES (value)""" # value must be tuple type
select_command = """SELECT * FROM (table) WHERE ..."""
update_command = """UPDATE (table) SET ... WHERE ..."""
delete_command = """DELETE FROM (table) WHERE ..."""

#To Do

上面提到了一部分,随时想起什么再写上放这里,咕咕咕

  • GUI 改用curses库了
  • 搜索功能使用正则匹配已完成
  • 重复密码条目添加时进行提示与引导
  • 又想起来一个,curses库只能在限定面板内显示查询结果,这样在对账号(邮箱)进行查询时,由于查询结果很多,可能由于终端面积不足而导致curses库运行出错 用curses pad解决了
padavan固件ipv6检验脚本
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×