65.9K
CodeProject 正在变化。 阅读更多。
Home

Pocket PC 的密码管理器

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.46/5 (14投票s)

2004年6月1日

CPOL

8分钟阅读

viewsIcon

64398

downloadIcon

399

一篇关于 Pocket PC 简单密码管理器的文章。

Password manager

Password manager

Password manager

引言

本文介绍了一个使用 Microsoft .NET Compact Framework 创建的简单密码管理器。使用此程序,您可以将电子邮件帐户、在线商店注册或计算机登录的所有密码安全地存储在一个地方,并在您的 PDA 上随时可用。

程序功能

  • 将密码和类似信息按文件夹组织。
  • 密码保存在加密文件中。
  • 支持全文搜索。

背景

密码管理器允许您存储密码和其他类似信息。我将这些信息称为程序中的“条目”。为了更好地导航,条目被组织在文件夹中。

每个条目包含一个描述性名称(例如,我的 NET 密码)、登录名(例如,j_smith)、密码、注释和可选的类别。这针对存储登录信息进行了优化,我相信这是最常见的——计算机登录、电子邮件帐户以及在线商店和其他服务的注册都适合此模式。

条目按文件夹组织。有三个内置文件夹,分别名为“不敏感”、“敏感”和“非常敏感”。每个文件夹都有一个单独的密码,并存储在单独的文件中。文件使用密码作为密钥进行加密。文件夹的理念是提供一个选项,可以快速访问不那么敏感的信息(例如,某个新闻网站的登录),而无需密码或只需简短密码,而非常重要的信息,如信用卡号,可以被另一个文件夹中的长而强壮的密码保护。

除了三个“真实”文件夹之外,还有几个虚拟文件夹,它们可以包含来自一个或多个真实文件夹的项。虚拟文件夹的示例是“所有项”文件夹,或包含属于特定类别的项的文件夹——例如,包含电子邮件密码、信用卡号等的文件夹。

使用代码

使用源代码

  • 将 zip 文件解压到您计算机上的某个文件夹。
  • 在 Visual Studio .NET 2003 中打开 PwdMan1 解决方案。
使用可执行文件
  • 从 zip 文件中解压 pwdman1.exe。
  • 在您的 Pocket PC 上创建一个新文件夹,例如 \\Program Files\PwdMan。
  • 使用 Active Sync 将 pwdman.exe 复制到该文件夹。
  • 如果需要,您还可以创建快捷方式在 \\Windows\Start Menu\Programs。

与程序协同工作

程序使用与 Pocket 2002 中的文件资源管理器显示文件相同的原理来显示条目(密码)。主窗口的顶部是一个组合框,其中包含可用文件夹的列表。下面的列表视图然后显示当前选定文件夹中包含的所有项。

程序启动时会显示第一个名为“不敏感”的文件夹的内容。此文件夹不受密码保护,或者更确切地说,它使用内置密码,并且用户从不被询问。这可能看起来很奇怪,但此文件夹用于不私密的信息,您只是不想记住它。因此,快速访问比安全更重要。我认为这可能很有用。特别是如果您的设备受到系统密码保护。其他两个文件夹“敏感”“非常敏感”只有在输入正确密码后才能显示。用户在组合框中首次选择文件夹时会提示输入此密码。密码仅需要一次,然后可以在程序终止或手动锁定文件夹之前切换到其他文件夹并返回。

虚拟文件夹无需密码即可访问,但它们只能显示来自已解锁的真实文件夹中的项。例如,如果您在程序启动后立即切换到“所有项”文件夹,它将仅包含“不敏感”文件夹中的条目。在解锁(输入密码并打开)“敏感”文件夹后,然后再次切换到“所有项”文件夹,它将包含来自“不敏感”“敏感”文件夹的条目。

每个条目(密码)可以属于一个类别,例如电子邮件或计算机登录。组合框中的文件夹列表包含每个类别的文件夹。这使得限制仅查看您需要的条目类别变得容易。

处理条目:列表视图中的列显示条目的描述性名称和登录名。要查看密码,用户必须选择条目并在工具栏中点击“显示条目”按钮。条目也可以被编辑和删除。文件夹中每个条目的名称必须是唯一的。

搜索:可以搜索条目任何部分(包括密码)中包含的文本。结果显示在一个名为“搜索结果”的特殊虚拟文件夹中——这与在 Windows 资源管理器中搜索文件时使用的方法相同。任何文件夹都可以被搜索,这意味着您也可以在搜索结果中递归搜索。

实现

程序使用了两个不是我编写的组件
  • Markus Hahn 编写的 Blowfish 类
  • 以及 GL Conseil 的 BlowfishStream 类。
这些类实现了 Blowfish 加密算法,该算法用于加密数据文件。使用 BlowfishStream 类,加密和将数据保存到文件非常简单
byte [] byteKey = jProtectedFolder.StrToByteArray(password);
using ( FileStream fs = new FileStream(folder.FilePath, 
    FileMode.Create, FileAccess.Write, FileShare.Read ))    
{
    BlowfishStream cry = new BlowfishStream(fs, BlowfishStreamMode.Write);
    cry.SetKey(byteKey);
    folder.SaveItems(cry);
    cry.Close();
    fs.Close();    
}

folderjProtectedFolder 类的对象,如下所述。

密码管理器中的一个条目由 jProtectedItem 类表示。它包含用于各个部分的字符串数据成员,例如描述性名称、登录名和密码。还有一个函数允许将项转换为字节数组。正如您所能想象的,这对于加密条目是必需的。还有一个反向函数,用于从字节数组初始化条目对象。

包含条目的文件夹在程序中由 jProtectedFolder 类表示。该类的主要成员是 ArrayList,它包含条目——jProtectedItems 类的实例。 SaveItems 方法将文件夹保存到流中,LoadItems 从流中初始化它。

存储:程序使用文件 folders.dat 来存储可用文件夹列表。启动时,它会读取文件夹列表并在主窗口的组合框中显示它们。该文件是纯文本,每行通过名称、加密数据文件的路径和一些可选设置来定义一个文件夹。尽管用户界面不提供此命令,但可以通过编辑此文件向程序添加新文件夹。如前所述,每个文件夹都保存到一个文件中,并使用 Blowfish 算法进行加密。

关注点

我是 C# 新手,我的母语是 C++,所以在过程中遇到了一些问题和惊喜。也许它们对您来说很有趣。

终止程序:Pocket PC 应用程序的徽标要求规定应用程序不应允许用户终止它。这对于没有经验的用户来说似乎是个好主意,但我还没有习惯这一点。我倾向于在使用“正在运行的程序列表”时终止程序。我在密码管理器的菜单中包含了一个“退出”命令,但对于最终发布,我添加了删除该项的代码。如果您玩源代码,您可能希望注释掉这一行,以便该项可见。这使得测试更容易。

private void Form1_Load(object sender, System.EventArgs e)
{
    WakeUp();    
    // Comment this out to display "Exit" item in the app menu
    menuItem5.MenuItems.Remove(menuAppExit);

对话框比我预期的要困难。我只是将表单样式设置为 FixedDialog 并调用 ShowDialog——然后表单会自己拉伸到整个屏幕,并抵抗任何使其变小的尝试。正如我发现的那样,Pocket PC 应用程序的规则是对话框应该是全屏的,并且系统会使其成为全屏。这很有道理。我需要的控件无论如何都覆盖了全屏对话框。我不理解的是为什么对话框会覆盖软件输入面板(键盘)。在模拟器上,您可能不会注意到,因为您是从计算机键盘输入文本。但当您在真实设备上运行程序时,惊喜是对话框会覆盖屏幕底部,您无法显示键盘来输入任何文本!解决方法是将 MainMenu 对象添加到表单。然后菜单栏将显示在窗口底部,您可以弹出键盘。另一个选择是使对话框变小,但据我所知,这需要将表单边框样式更改为 None,自己绘制边框以及其他一些棘手的事情。

文件异常:我在处理存储每个文件夹条目的文件时遇到了奇怪的错误。当文件夹首次显示时,它会从文件中加载。然后文件被关闭。稍后尝试保存到文件时会以 IOException 结束。但只是有时。尤其是在更改空文件夹的密码时(此时文件将使用新密码加密重写)。即使在调试时捕获异常,也无法从异常对象中获得任何有用信息。这可能是因为我缺乏 C# 经验,但 GetLastError API 对我来说似乎更有帮助。我怀疑文件在读取后仍然以某种方式被锁定。快速的互联网搜索证实了这一点。将文件操作放入 using 语句解决了问题。

我在模拟器和运行 Pocket PC 2002 的 Pocket LOOX 上测试了该程序,它似乎工作正常,但如果您发现任何错误,请告诉我。

历史

  • 首次发布日期:2004 年 5 月 27 日。
© . All rights reserved.