本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

自制密码管理器—PasswordPump

发布时间:2022-08-09
分享到:

自制密码管理器—PasswordPump

发布时间:2022-08-09
分享到:

PasswordPump 是一种 USB 设备,可管理多达 254 个帐户的凭据。凭证在设备上使用 AES-128 进行加密。

介绍
凭据(帐户名、用户名和密码)仅存储在设备本身上,在两个使用军用级加密 (AES-128) 的可移动 EEprom 芯片上。它们不存储在云中或在您计算机上更容易受到黑客攻击的文件中。凭据备份在设备本身上;即,加密凭证从主 EEprom 芯片按需移动到备用 EEprom。您可以从设备中移除 EEprom 芯片(可能保留第三或第四个备份)。凭证可通过旋转编码器(左侧)或键盘和串行终端输入。设备本身约为 1 1/8 x 2 3/4 英寸或 29 x 71 毫米,可以装在一个稍大的箱子中。

特征

  • 在单个 25LC256 EEprom 芯片上存储多达 254 组凭据。
  • 凭证按字母顺序存储,便于定位。
  • 最多允许输入主密码失败 10 次,然后自动清除芯片并恢复出厂设置。
  • 所有凭据都使用 AES-128 加密,主密码使用 SHA-256 进行哈希处理。
  • 所有加密的帐户和散列的主密码都是加盐的。
  • 该设备不易受到标准密码攻击。
  • 外部 EEprom 上的备份已加密。
  • 所有凭据都可以转储到文本文件中以进行额外备份(例如,存储在保险箱或保险箱中并加密的拇指驱动器)。
  • 支持通过键盘和串行终端或旋转编码器输入凭据。
  • 访问您的所有凭据只需要一个最多 14 个字符的主密码。
  • 不活动 1 小时后自动注销。
  • 可选密码生成,31 个随机字母、符号和数字字符,用于极强的密码。
  • 将设备上的密码显示配置为打开或关闭。

您可以通过转动旋转编码器来浏览菜单项,顺时针向下移动列表,逆时针向上移动。帐户名称按字母顺序存储。要选择一个项目,请单击旋转编码器(短按)。要备份,请按住旋转编码器半秒以上(长按)。

操作要打开设备,您只需使用 micro USB Micro-B 插头转 USB-A 插头电缆将其插入 USB 端口/插座,该电缆与您用于为 Android 手机充电的电缆相同。第一次插入时可能需要安装驱动程序。该驱动程序可在本文下方下载。如果我将设备运送给您,它已经与程序一起闪烁并设置了锁定位。

设置锁定位有助于更好地保护散列主密码和源代码。

第一次打开设备电源时,你会看到:

此时您需要输入主密码。尝试选择一个您会满意的主密码,因为如果您想更改它,您必须重置设备,这会清除您的所有凭据。之后,只有一种方法可以将凭据重新输入设备,即通过键盘或旋转编码器键入它们。还要尝试选择一个可以更快地输入设备的密码。它应该是大写和小写的组合,带有数字,也可能是一个或两个符号。我喜欢选择一个几乎可以完全用左手输入的密码,我发现通过旋转编码器更容易输入。您应该选择一个强密码,字母、大小写、数字和特殊字符的组合,长度在 7 到 14 个字符之间。要输入字符,转动旋转编码器直到出现字符,然后按下旋转编码器(短按)以选择字符。

如果你输错了,目前没有办法备份,所以要小心。输入完整的主密码后,长按设备(向下按旋转编码器超过 1/2 秒)。输入了主密码之后,现在可以输入一组凭据了。输入完整的主密码后,长按设备(向下按旋转编码器超过 1/2 秒)。

添加凭据

要通过键盘添加一组凭据,您需要打开一个串行终端。最适合我的是 Arduino 串行终端。因此,如果您打开 Arduino IDE,请转到 Tools->Ports 并选择 Arduino/Genuino Micro 端口。然后选择工具->串行监视器(或 Ctl+Shift+M)。接下来,在您的 PasswordPump 上向下导航到 Keyboard OFF,然后单击一下将其更改为 Keyboard ON。导航回添加帐户并短按。你会看到的:

账户名称 添加账户

短按,然后切换回 Arduino 串口终端并输入账户名,然后按回车键。然后长按密码泵。现在应该看到:

编辑用户名 [您输入的帐户名称]

再次短按,切换回 Arduino 串行终端并输入用户名,然后按回车键。然后长按密码泵。现在应该看到:

编辑密码 [您输入的帐户名称]

再次短按,切换回Arduino串口终端并输入密码,然后按回车键。然后长按密码泵。现在应该看到:

指示样式[您输入的帐户名称]

再次短按并使用旋转编码器指定 0 或 1。如果在提供用户名和密码时,密码泵应在发送用户名和发送密码之前发送回车,则指定 0。如果在提供用户名和密码时,密码泵应该在发送用户名和发送密码之前发送一个选项卡,则指定 1。然后长按密码泵。您现在应该看到:

Account Name [您输入的帐户名称]

再次长按,你会看到:

查找帐户[您输入的帐户名称]

到此已完成输入凭据。

注意:也可以仅使用旋转编码器输入凭据。键盘可以开也可以关。只需使用旋转编码器以类似于输入主密码的方式输入凭据。

发送凭证

导航到查找帐户并短按。使用旋转编码器滚动浏览您输入的凭据列表。找到与要发送到计算机的凭据关联的帐户名称后,将输入焦点放在提示您在计算机上输入凭据的窗口中的用户名文本框中。在密码泵上,您应该看到:

发送用户并通过 [您选择的帐户名称]

短按发送用户名、回车或制表符(取决于样式设置),然后是密码。如果您选择了正确的样式,您现在应该登录到您的帐户/应用程序。

如果您只想将密码发送到计算机,然后回车,请使用旋转编码器向下滚动一次,直到看到:

发送密码 <RET> [您输入的帐户名称]

并短按发送密码和回车符。

同样,您可以只发送用户名或只发送帐户名。

编辑凭据

要编辑一组现有凭据,首先决定您是要通过键盘还是仅通过旋转编码器来编辑凭据。如果您要通过键盘编辑凭据,请按照切换键盘输入中的说明进行操作。然后使用查找帐户导航到您要编辑的帐户并短按。然后向下滚动到 Edit Creds 并短按。然后滚动到要编辑的属性;帐户名称、编辑用户名、编辑密码或指示样式,之后短按。使用键盘以添加凭据中所述的方式重新输入属性,或者仅使用旋转编码器重新输入属性。然后长按保存更改。如果您要为帐户生成新密码,请按照生成密码中的说明进行操作。

删除凭证

确保有当前的 EEprom 备份。导航到查找帐户并短按。使用旋转编码器选择要删除的帐户,然后短按。使用旋转编码器向下滚动到 Delete Acct 并短按。通过使用旋转编码器选择 Y 并短按来确认您希望删除帐户。该帐户现已清空,并且已从主 EEprom 芯片中删除。但它还没有从备份的 EEprom 中擦除,所以如果你不小心删除了一个帐户,并且你有一个最近的备份,你可以恢复备份并且该帐户将重新出现。导航到查找帐户并确认您的帐户已被删除。

如果您无法滚动浏览所有帐户,则表明出现了间歇性缺陷,并且管理所有帐户显示的链接列表已损坏。从 EEprom 恢复最新的备份。如果您在删除帐户后立即备份 EEprom,它也会从辅助 EEprom 中擦除。

生成密码

在尝试将密码更改为新生成的密码之前,请通读这些说明。PasswordPump 最强大的功能是它能够生成随机 31 个字符的密码并记住它们。这些密码非常难以猜测,并且不易受到暴力破解帐户的攻击。在执行此操作之前,您应该确保您拥有所有凭据的当前备份。要为帐户生成密码,只需通过查找帐户找到该帐户,然后通过短按帐户名称来选择凭据。

在您计算机上的应用程序中,导航到更改密码功能并将输入焦点放在旧密码文本框中。在 PasswordPump 上导航至发送密码(不发送密码 <RET>)并短按。在您计算机上的应用程序中,通过按 <TAB> 键将输入焦点放在新密码文本框中。在 PasswordPump 中向下滚动到 Edit Creds 并短按,然后向下滚动到 Gen Password 并短按。这会将密码更改为随机生成的 31 个字符系列。现在长按一次,导航到发送密码(不发送密码<RET>)并短按。

如果您需要确认新密码,请将输入焦点放在计算机应用程序中的该文本框上,然后再次短按。通过按回车键或单击相应按钮来确认您的密码更改。现在,您的帐户上有一个随机的 31 个字符的密码,并且该密码唯一存在的地方是 PasswordPump 上的加密 EEprom 芯片上。此时它'备份到 EEprom 和备份到文件是一个好主意,并确保您可以以某种方式从该帐户丢失的密码中恢复。

警告:如果由于不接受旧密码而导致更改密码的尝试失败,请注意您刚刚用新生成的密码覆盖了旧密码。要恢复旧密码,您需要从 EEprom 恢复备份并重试,或转到拇指驱动器上的加密备份文件以获取帐户的当前密码,或使用任何机制从帐户中恢复密码您可以通过应用程序或网站获得。提前考虑并小心,以免将自己锁定在帐户之外!

注销

当您想注销设备时,使用旋转编码器导航至注销并短按。RGB LED 从绿色变为蓝色。您现在已注销,必须再次输入主密码才能使用该设备。如果您要离开计算机去喝咖啡,最好锁定计算机并注销 PasswordPump。

切换键盘输入

导航到键盘开/关。短按切换设置。当键盘打开时,您可以使用添加凭据中描述的过程通过键盘输入凭据。当您不输入凭据时,请将键盘设置为关闭。此设置在设备关机时不保存,默认为键盘关闭。

显示/隐藏密码

使用旋转编码器导航到 Show Psswrd ON/OFF。短按切换设置。此设置会在您注销并关闭设备电源时保存。

备份到 EEprom

在密码泵上,使用旋转编码器导航到备份 EEprom。短按,然后通过使用旋转编码器选择 Y 并短按确认您要从主 EEprom 备份到辅助 EEprom。进行备份时,RGB 将呈黄色,然后变回绿色。

备份到文件
在 PasswordPump 上,使用旋转编码器导航到备份到文件。在您的计算机上打开一个文本编辑器(没有自动完成功能的),notepad.exe 效果最好,并将输入焦点放在文本编辑器中。我个人使用 UltraEdit,因为它内置了加密功能。然后短按备份到文件。主 EEprom 芯片的内容(存储在 PasswordPump 中的所有凭据)都转储到文本编辑器中。RGB LED 变为紫色,然后在操作完成后变为绿色。最好使用 WinZip 或类似工具使用密码将其压缩,然后将其存储在拇指驱动器上,然后再将其存储在保险箱或保险箱中,从而加密此文件。从您的计算机中删除原始文件并清空垃圾箱。通过定期执行此操作使此文件保持最新。

从 EEprom 恢复备份

如果您决定要恢复 EEprom 备份(或者,换句话说,让辅助 EEprom 的内容覆盖主 ​​EEprom 的内容),然后导航到 PasswordPump 上的恢复备份。短按,用旋转编码器选择 Y 并短按确认操作。RGB LED 将变黄,直到操作完成,然后变回绿色。

执行出厂重置
您想要清除主 EEprom 上的所有加密凭据并将设备重置为出厂设置。在 PasswordPump 上,使用旋转编码器一直向下导航到 Reset。短按。通过使用旋转编码器选择 Y 并短按,确认您要恢复出厂设置并清除所有凭据和主密码。设备恢复出厂设置时,RGB 会先慢速闪烁蓝色和红色,然后快速闪烁,然后变为蓝色。此时您可以输入新的主密码。请注意,恢复出厂设置不会清除备份 EEprom 上存储的凭据。如果您使用相同的主密码,您将能够恢复备份并查看凭据。如果您还想清除备份 EEprom,请在输入新的主密码后选择备份 EEprom,

RGB 颜色和含义

绿色 - 登录蓝色 - 未登录红色 - 登录尝试失败/错误备份或初始化 EEprom紫色 - 发送凭据黄色 备份到 EEprom快速闪烁红色/蓝色 - 初始化外部 EEprom慢速闪烁红色/蓝色 - 初始化内部 EEprom

库如果要编译源代码,需要在 Arduino IDE 中安装以下库:

  • https://rweather.github.io/arduinolibs/index.html - AES 和 SHA 库,MIT 许可证。
  • https://github.com/LennartHennigs/Button2 - 用于旋转编码器上的按钮,版权所有 (c) 2017 LennartHennigs,MIT 许可证。
  • https://github.com/brianlow/Rotary - 用于旋转编码器,GNU GPL 版本 3。
  • https://github.com/arduino-libraries/Keyboard - 用于将字符发送到键盘,就像用户输入的一样,GNU 宽通用公共许可证。
  • https://www.arduino.cc/en/Reference/EEPROM - 用于内部 EEprom
  • https://github.com/greiman/SSD1306Ascii - 对于 SSD1306 显示设备,Bill Greiman <fat16lib@sbcglobal.net>。

重要披露:使用提供的加密库,我努力使用 AES128 加密存储在外部 25LC256 EEprom 上的所有凭据(并对主密码进行哈希处理,该密码使用 SHA256 存储在内部 EEprom 上)。我已经对散列的主密码和每组凭据进行了加盐处理。这个项目是我第一次使用加密,并且没有正式的代码审查,所以我可能做错了,标准免责声明(请注意)适用于这种情况。我使用 PC 和 CH340 24/25 系列 EEprom flash BIOS USB 编程器检查了外部 EEprom 芯片的内容(在存储了多组凭据之后)并且所有用户名、帐户名和密码都显示为加密。

小缺陷

目前使用 97% 的程序存储区域和 66% 的动态内存。这使得在不将新功能替换为现有功能的情况下向产品添加新功能非常困难。我想添加几个新功能,但由于内存限制,我不能添加。例如,在完全不活动 1 小时后,设备会超时,您将退出该设备。我想让那个时间段可配置(例如,如果你愿意,你可以将其设置为 2 小时),但我根本没有空间添加该功能。我认为一小时可能是一个很好的折衷方案,在使用我身边的设备时,我会定期将旋转编码器向任何方向转动一两下,以将自动注销时间提前一小时。

烧写程序我正在使用外部编程器将程序烧录到设备上。即从 Arduino IDE 我选择 Sketch-->Upload Using Programmer 将程序发送到 ATmega32u4/Arduino Pro Micro。我这样做的部分原因是它覆盖了引导加载程序,我想覆盖引导加载程序因为这样做我在设备上有更多空间用于程序。如果引导加载程序存在,我认为该程序不适合 Pro Micro,但我还没有测试过。我也不认为由于其他原因,设备将与存在的引导加载程序正常工作。

在使用外部编程器进行编程时,我仍然需要通过 USB 电缆为设备供电。如果您通过自己采购零件或使用套件构建设备,请确保在将 Arduino Pro Micro 焊接到 PCB 板后不要剪断接头引脚,如果您希望能够加载新的固件。如果您剪断与 PCB 板齐平的插头引脚,则无法重新编程设备;您需要将 VDD、GND、RST、MOSI、MISO 和 SCK 从外部编程器连接到 Arduino Pro Micro 以刷新程序。执行此操作的说明可在此处找到。 请放心,我对锁定位的初始设置不会阻止您重新刷新程序。如果您想在重新刷新程序后重置锁定位,您可以这样做。

对我来说,最简单的方法是使用 Atmel Studio 和我的 USB AVRISP XPII。但是您实际上并不需要设置锁定位,因为无论如何现在每个人都可以使用源代码。设置锁定位的唯一好处是更安全地存储散列主密码。存储在内部 EEprom 中的主密码使用 SHA-256 进行哈希处理。

分发此程序和设备是希望它们有用,但不提供任何保证;甚至没有对适销性或特定用途适用性的默示保证。

已知缺陷

  • 当 \e 嵌入到帐户名(或用户名或密码)中时,它被解释为 ESC 字符,并且输入为空。例如 INSIGHTORADB\entmetrics。只有通过键盘输入时才会出现问题,而不是编码器
  • 有时删除帐户会破坏管理凭据显示顺序的双向链表。发生这种情况时,用户需要从 EEprom 恢复以取回丢失的凭据。
  • 从 Find 或 Add acct 重新调整后,DisplayLine2 需要清空。
  • 通过键盘输入 29 个字符长的帐户名称时,什么也没有输入。
  • 10 次登录尝试失败后的自动初始化提示用户确认操作。
  • 在 EVENT_SINGLE_CLICK 的 switch 语句中,case 语句不按顺序排列。当它们按顺序排列时,它不会正确评估。
  • 母微型 USB 连接极其脆弱。

未来
我目前受到 ATmega32u4、32k 中可用闪存数量的限制。所有的空间都被程序占用了。如果我有更多空间,我可以添加其他功能。特别是,我有兴趣编写将在计算机上运行的 GUI,该计算机将与 PasswordPump 干净地交互。使用 Arduino 串行终端添加凭据充其量是尴尬的,但我认为需要更多内存来纠正这种情况。我还希望有更多的 EEprom 空间,以便 64 个字节可用于用户名、密码和帐户名。此外,我认为使用 AES-256 进行加密会更好。可能满足所有这些要求的设备是带有 ATSAMD51 的 Adafruit ItsyBitsy M4 Express,以下是该产品的一些功能:

  • 以 120 MHz 运行的 Cortex M4 处理器
  • 512KB 闪存(比 ATmega32u4 大 16 倍)
  • 1.4 英寸长 x 0.7 英寸宽(比 Pro Micro 小)
  • 2MB SPI Flash(与两个 25LC256 芯片的 64k 相比)
  • 本机硬件 I2C 和串行(与 SSD1306 显示器接口)
  • 内置 AES 加密引擎,256 位(替换加密库)
  • 每个操作系统都支持本机 USB(像键盘一样发送凭据)
  • 可与 Arduino IDE 一起使用
  • 内置 RGB DotStar LED(替换 PasswordPump 上的 RGB)
  • 复位按钮
  • 通过 USB 供电

本文中所用到的一些代码

如果您对此项目有任何想法、意见或问题,请在下方留言。

以上内容翻译自网络,原作者:Dan Murphy ,如涉及侵权,可联系删除。

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论