PwdManage密码管理工具
nmask 安全工具 19702浏览 · 2017-06-14 19:31

几个月前我突发奇想地写了个密码管理工具,今天又更新了点功能,于是想跟各位大牛探讨一下,如果想要自己设计密码管理系统或者工具,应该怎么做比较安全?

先分享下我自己设计的密码管理工具,以下内容来自个人博客:http://thief.one/2017/04/24/1/

设计思路

首先作为一个密码管理工具,得有3个最基础的功能,密码生成、密码存储以及密码查询。

密码生成

原本想借助于AES算法的,但是实际编写过程中出了点状况,因此改用base64(进过特殊处理)。
当然用来加密明文密码不可能只用简单的base64,其中经过多次复杂的转换,并且生成的密码存在一定随机性,不易发现规律。

密码存储

原本是想搞个数据库用来存储密码,但后来发现不够简便,于是用了最简单的文件存储,并借助了git库,将文件同步到远程git仓库中。

密码查询

这个很好实现,从文件中读取密文内容,通过算法解密,然后输出。

项目介绍

  • config_init存储配置文件,进入程序密码、git仓库地址
  • pwdmanagedb/pwd.db存储密文密码
  • pwdmanage.py项目程序代码

说明:存储到文件的内容都进过特殊的加密,一般没有pwdmanage.py是无法解密其中的内容的。pwd.db存储在git项目中,每次运行程序时都会向远处仓库pull最新内容,每次本地新增一个用户也会立即同步推送到远处仓库中。

Usage

更新启动密码

python pwdmanage.py --upwd 123456


修改当前密码为123456,需要输入老密码。

更新git库地址

python pwdmanage.py --gitaddress "./pwdmanagedb"


修改本地git项目文件路径为./pwdmanagedb,需要输入密码。

开启git远程同步功能

python pwdmanage.py --gitswitch True

默认为关闭的,即密码文件存储在本地,不会同步到远程git库中。

生成新密码


输入注册账号的网站url,以及用户名,即可生成密码。密码分为明文与密文,密文将会存储到pwd.db文件内,并同步到指定的git仓库中。

查询密码


输入url(支持模糊查询),可以查询出该url下注册的用户名与密码。

列举账户下所有的密码

python pwdmanage.py --l

列举出所有网站的账号密码。

删除密码

[-pwdmanage-]>> www.baidu.com nmask --delete

将百度网址的nmask账号删除。

手动设置密码

[-pwdmanage-]>> www.baidu.com nmask 123456 --set

将百度网址的用户名为nmask的密码设置为123456。

文件存储内容


都是经过特殊处理后的base64密文。

后记

  其实这个项目的关键点就在于密码生成的密文是否可能被解密,我想说可能性还是有的,比如说拿到了项目程序,恰巧破解了config.init中写的程序开启密码,并利用程序中内置的函数去解密。在实际使用时,会将py程序打包成可执行程序,避免源码泄露导致加密算法流出,当然通过反编译依然可以拿到源码。因此为了尽可能避免此事件,我的做法是将pwd.db文件与pwdmanage.py分离开,即退出程序后,将pwd.db文件删除,由于此文件是存在远端仓库中的,因此不用担心会丢失。而当别有用心之人拿到pwdmanage.py程序后,还必须知道远程项目地址密码,方可下载pwd.db并破解其中的密码。
  最后再补充一句,即使以上步骤都被攻破了,那也没关系,反正银行卡密码都在脑中,对了,还有caoliu密码。

讨论讨论

  其实当初我自己设计的密码管理工具,主要还在于可以方便的存储以及查询密码。设计之初,我的想法是每个论坛或者网站的密码都设置的不一样(且没有规律可循),即使有网站被脱裤了,也不会影响到我其他网站的密码。然后统一管理该密码,添加增删改查的功能即可。一开始我考虑使用数据库存储,但后来发现太臃肿,因此使用了git库来存储本地密码文件。
那么最关键的点在于,每个网站的密码是怎么生成的,然后又是怎么加密的?  生成的话我使用了很多随机的因素,加密我用了最简单的base64+16进制+混淆(打乱顺序等操作),由于对密码学了解的不深,因此没有使用相对安全的加密算法。总体来说,感觉不是很安全,当然我想也没有人这么无聊来破解我的程序盗取密码(无非就是一些论坛的密码)。
那么现在的问题是,该如何系统地设计密码管理工具呢?

4 条评论
某人
表情
可输入 255