Exile 1.8 - 密码管理器






4.57/5 (49投票s)
2004年4月5日
8分钟阅读

281153

7390
又一个密码管理器。
引言
这可能不是常见场景,但无论如何都会发生——你知道情况是怎样的。我个人有两个电子邮件帐户,无数个我注册过的网站,还有更多更多。时间流逝……
……突然需要记住的信息量(本身尝试完全不合理)达到了某个水平,我面临几个互斥的选项
- 忘掉一切——可能是最简单的选择,但它可能会导致神经衰弱之类的……
- 把所有我能记住的写在一张显眼的橙色(黄色、红色……)纸上,然后藏起来,希望能记得我放在哪儿了。
- 把所有密码和东西写在一个记事本文件中,然后要么被盗,要么,根据墨菲定律,在我输入 format c: 神咒按下 Enter 后才想起来。
- 下载某个程序。最简单的选择,但出于某种原因(我承认我没有花几周时间寻找一个 a. 简单,b. 免费,c. 安全的程序),我选择了另一种稍有不同的选择,那就是……
- 写我自己的密码管理器。
当然,一定有一些很棒的程序(嗯……)做着同样的工作,但写我自己的密码管理器供个人使用(我实际上最初没想过把它发到 The CodeProject 上)非常有趣,所以这是我工作的成果。
背景
起初,我花了一些时间寻找合适的加密算法(那时,我甚至没想过我还需要一个哈希算法——计划不足之类的……)。我选择了 RC5——一种对称分组密码,据说速度快且安全。起初,我想写某种 CRC5
类,但(主要为了好玩)我决定把它变成一个独立的、外观漂亮的 DLL,带有一些 API(上下文、句柄等等……)。然后我开始考虑程序本身会是什么样子。将用户名和主密码存储在密码存储本身的想法似乎很阴险,所以我意识到需要一个哈希算法,我选择了 MD5,由不知疲倦的Ronald R. Rivest 教授发明。和 RC5 一样,一个简单的 CMD5
类变成了独立的 DLL。所以这是我决定实现的:
- 在密码存储中存储 <用户名> + <主密码> 的哈希值,并在尝试打开存储时与输入的 <用户名> + <主密码> 的哈希值进行比较。
- 通过反复哈希 <用户名> + <主密码> + <所有先前哈希值> 来生成私钥,这样知道 <用户名> + <主密码> 组合哈希值并不能保证成功破解。
- 加载时,所有敏感信息都保持加密状态,直到显示在屏幕上。
代码
关于代码和我的风格的一些说明(如果有人感兴趣)。核心代码相当直接(希望)并且注释良好——再次强调,我最初没有打算发布它或其他什么。在警告级别 4 下可以清晰地编译——嗯,除了愚蠢的 C4786 警告,编译器因长名称而卡住,但发布版本应该可以完美编译。我没有可能(或者可能是我太懒)在 Windows 2000 以外的平台上测试该程序,我认为如果您想在 Windows 9x 上运行它,需要记住一些事项。
根据 MSDN,IDC_HAND
资源(一个光标——参见 StaticHyperLinkEx.cpp)仅是 Windows 2000 及以上版本的标准资源,所以请考虑到这一点——您可能需要导入一个合适的光标或其他什么。
此外,静态控件的 SS_ENDELLIPSIS
样式在 Windows 9x 上可用——它仅适用于 Windows NT 及更高版本,所以这段代码
...
// Setting up title font
GetDlgItem(IDC_TITLE_TITLE)->ModifyStyle(0, SS_ENDELLIPSIS, 0);
// If title doesn't fit
...
应该被移除或以某种方式更改。而 PathCompactPathEx()
在所有平台上都需要 Internet Explorer 4.0。
出于某种(晦涩的?)原因,通常的用户界面更新功能在基于对话框的应用程序中似乎不起作用,所以我不得不通过调用 SwitchMenu()
并传递一些标志来切换菜单项。
我奇怪为什么 Tree View 不支持原生拖放——为了实现这个功能,我花了大量精力去解读编写糟糕的 SDK 文档。
关于问题和“尚未实现”的事项(除了上述内容)
- 在元素之间切换或在隐藏密码和显示密码模式之间切换时出现了一些闪烁。这是因为控件的开启和关闭,我希望很快能修复它。
- 某种程度上不方便的密码生成器,因为您必须移动鼠标来生成密码——但另一方面,它也并非那么糟糕……
- Unicode 支持尚未经过充分测试。
结果
这一部分很可能是一个功能列表,但我想它们差不多。所以我们现在拥有的就是:
- 相当快速且轻量级的程序。密码的吞吐量对于所有小于 832 位的密钥长度都相同,因此没有性能上的理由选择更短的密钥。
- 合理的安全级别。目前,我还没有看到关于 RC5 成功密码分析的评论或其他什么。我不能对 MD5 说同样的话,因为B. den Boer 和 A. Bosselaers 成功发现了这个哈希算法中的碰撞(参见《MD5 压缩函数的碰撞》了解详情),但这个事实并不影响整体安全级别。
- 原生文件格式。这允许进行一些与 Shell 相关的操作,例如双击打开存储……嗯,你知道情况是怎样的。
- 用户文件哈希。此功能可用于哈希某些用户的加密文件(或消息)以监控其一致性和完整性。
- 密码生成器。这并非重大创新,但仍然是一个非常方便的功能。
- 易于使用。界面上所有功能都清晰可见。树控件中的上下文菜单可能不是那么明显,但它们确实存在(对话框中的超链接也是如此)。
- 密码安全性。这不是一个显而易见的概念,但想法很简单。通过暴露密码的确切长度,安全性级别可能会大大降低,所以如果你有一个,比如,6 个字符的密码,并且处于隐藏密码模式,程序将始终显示 10 个星号。
- 某种智能上下文菜单(一个花哨的名字,不是吗?;)?)。菜单项不仅仅是启用或禁用——相反,当我右键单击左侧的树的各个部分时,我正在加载完全不同的菜单(具有更方便的布局)。
- 热键。每个元素都可以分配一个热键,因此相应元素密码会直接传输到当前聚焦的窗口,但它在某种程度上被智能输入所取代。
- 评分项。所有项目(类别和元素)都可以根据其重要性进行评分。
- Shell 扩展。提供一个工具提示,其中包含有关存储版本和密钥大小的信息。主要为了好玩……
- XML 导出。仅将密码存储导出到 XML 文件。我目前正在学习 XSLT,以便创建一些花哨的转换。
- 智能输入。最有趣的事情(至少我认为是这样)。通过按下定义的组合键,密码和登录名可以自动、轻松地传输到聚焦的窗口。
如果有人感兴趣,还有几点(这些直接来自选项对话框)
- 维护文件关联
- 最小化到托盘
- 保存前创建备份
- 退出时自动保存
- Shell 以只读方式打开
- 重新加载最后一个存储
- 以只读方式重新加载
- 智能输入
- 自动排序
- 剪贴板擦除
反馈
如果您遇到任何错误或有任何想法——请给我发电子邮件。所有建议都将不胜感激。
历史
- 1.8 Build 1482 (2005 年 3 月 5 日)
- 这主要面向开发人员——添加了一个新的项目配置(静态链接 MFC 的发布版本)——灵感来自alens。
- 新的可执行文件(适用于没有安装 VS2003 的用户)——比第一个稍大——在这里,gixxer600。
- 添加了安装程序(感谢Jordan Russell 的 InnoSetup)。
- 1.8 Build 1482 (2004 年 8 月 15 日)
- MD5 哈希生成器现在完全符合 RFC 标准(灵感来自Robin Schive)。
- 地址字段已链接。
- 图标现在位于一个单独的 DLL 中,因此可以构建一个新的(感谢Robin Schive 和许多其他人)。
- 1.7 Build 1421 (2004 年 7 月 15 日)
- 删除了主对话框上无用的按钮——它在 Windows XP 下看起来确实很糟糕。
- 已移植到 Visual C++ 2003,将不再有 Visual C++ 6 版本。
- 还有几点我实在记不清了:)
- 1.7 Build 1372 (2004 年 6 月 24 日)
- 存储现在可以以只读模式打开。
- 备份之前的存储。
- 一些新选项。
- 将设置保存到XML 文件。
- "复制"命令现在可在所有字段中使用(这是一个非常流行的请求)。
- 1.5 Build 1156 (2004 年 5 月 8 日)
- 智能输入功能(部分灵感来自Garth J Lancaster)。
- 可以导出到 XML。
- 一些 UI 修复/改进。
- 1.4 Build 867 (2004 年 4 月 24 日)
- Shell 扩展,在工具提示中显示存储版本和密钥大小(感谢Michael Dunn 的一系列精彩文章)。
- 移植到 Visual Studio .NET 2003(显然不是 C#)。
- 右键单击密码链接会将密码复制到剪贴板(感谢metomas)。
- 项目可以根据其重要性进行评分(部分灵感来自Orcrist)。
- 项目可以排序(包括类别和元素)。
- 最后,添加时它们可以自动排序。
- 1.2 Build 720 (2004 年 4 月 19 日)
- 修复了用户文件哈希中的一个错误。
- Enter 键在所有“备注”和“描述”字段中都能正常工作(感谢zijan)。
- 1.1 Build 713 (2004 年 4 月 11 日)
- 添加了“最小化到托盘”功能。
- 添加了“退出时重新加载最后一个存储”功能。
- 可以实现“退出时自动保存存储”。
- 可以分配热键将密码直接传输到目标窗口。
- 可以直接通过程序设置存储选项。
- 文件关联由程序直接维护。
- 1.0 Build 521 (2004 年 4 月 4 日) - 初始版本。