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

结束弱密码时代:永远不必输入密码(永远不必记住密码)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (16投票s)

2016年8月5日

CPOL

21分钟阅读

viewsIcon

37073

downloadIcon

494

将此设备插入您的计算机,从此无需再输入或记住任何密码。没错,您无需记住您的Windows登录密码(反正它会非常长且复杂,您也记不住)。

生生不息,繁荣昌盛……忘记所有密码。
~斯波克中校
企业号星舰

引言

许多人会记得我最近的文章(阅读量超过297,000人),该文章讨论了一种方法,允许用户创建基于加密强哈希的密码,从而使他们永远无需再次创建密码。您可以在这里阅读该文章:消灭所有密码:再也不用记住密码[^](绘制您的密码)。

缺失的部分:找到了!

然而,当时有一个缺失的部分。你无法为电脑的主登录界面生成密码。那是因为当你的电脑停留在主登录界面时,无法运行我的应用程序来绘制你的形状并生成密码。此外,即使你在手机上运行程序并生成了密码,密码也非常长(加密哈希),你永远不会想手动输入它们。

再也不用输入密码

通过这篇文章,我解决了这个问题,并创建了一个设备,让您再也不用输入密码。如果您能坚持看完并仔细思考(并查阅文章末尾的我的高级想法),我相信您会被说服,我是彻底消灭弱密码的人*

在头脑中记住30多个密码的暴政结束了!朋友们,它结束了。

*我是认真的,我真诚地相信如果你读完整篇文章,你会同意。我们刚刚超越了密码!

工作原理快速概览

概述:工作原理

  1. 在网格上绘制您的形状。您只需为所有网站绘制一个形状,因为密码将通过“站点名称”(以及其他因素——更多详细信息请参阅上述文章)进行加盐,因此为每个网站生成的密码将是唯一且加密强度高的。
  2. 选择您要为其生成密码的站点。这将是一个下拉列表,允许您添加用于跟踪密码使用站点的唯一标识符。它可以是您想要的任何字符,并且将为您提供一种记住您使用密码的站点的方式。
  3. 生成密码。点击此按钮将根据您在网格上选择的点以及“站点名称”的盐值生成哈希值。
  4. 此时,您将确保配对的计算机处于登录屏幕,并且光标位于密码框中。之后,点击发送按钮,密码将通过(加密)蓝牙发送出去。
  5. 附带的BlueKeySafe设备将通过其蓝牙接收器接收密码。
  6. 最后,BlueKeySafe设备将密码输入到密码文本字段(该字段具有光标焦点)。

一旦您登录到计算机,如果您愿意,可以运行DrawPass的普通桌面版本(参见本文顶部我之前提到的文章),但您不必这样做。相反,每次您访问需要登录的网站时,您只需将光标设置在密码文本框中,在配对设备上生成密码并按下[发送]按钮即可。

Android原型版本中缺失的其他功能

当我创建DrawPass的桌面版本时,很多人强烈要求能够添加特殊字符、大写字符和/或将密码设置为特定的最大长度(那些强制使用短密码的愚蠢网站会使密码变弱)。然而,在Android原型DrawPass中,您可能看不到这些元素。这仅仅是由于时间限制,以及我非常兴奋地将其作为CP IoT竞赛的参赛作品提交。如果您查看DrawPass的桌面版本,您将对最终产品有一个更好的了解。

桌面和安卓应用(原型不匹配)

另外,请注意,随着我开发安卓应用的代码,生成哈希密码的一些内容发生了变化,所以在更新另一篇文章之前,哈希值将不匹配。这都是原型开发过程的一部分。

更新即将到来,以便安卓应用和桌面应用相互匹配。

 

现在,让我们看看我是如何开发这个设备(BlueKeySafe)的,以及构建一个设备所需的一切,然后我们可以讨论使用它的好处和其他细节。

BlueKeySafe原型开发

我为物联网竞赛的第一个参赛作品(再也不用买车库门遥控器:用你的安卓手机开门(通过蓝牙)[^])投入的所有工作都得到了回报,因为我了解了围绕一个名为HC-05的精巧蓝牙组件构建硬件的简单性。

在了解到可以轻松从配对设备获取数据后,我偶然发现了SparkFun (SparkFun Electronics[^]) 的极富创造力的人们制造的另一个出色的开发板,名为 Pro Micro。您可以在以下地址查看详细信息并获取数据手册:Pro Micro - 5V/16MHz - DEV-12640 - SparkFun Electronics[^]。

请参阅零件清单,获取亚马逊产品链接以便轻松购买。

 

sparkfun pro micro

强迫自己学习的力量

如果我没有完成第一个项目,学习了Atmel芯片和蓝牙模块的功能,我永远无法理解这块小板子所蕴含的力量。那是因为Pro Micro实现了ATmega32U4。该芯片可以使用我之前文章中使用的相同代码进行编程,该代码实现了ATMega328P芯片。

输入和输出引脚

此外,如果仔细查看板子(https://cdn.sparkfun.com//assets/parts/9/3/2/6/12640-02a.jpg -- 放大视图[^]),您会看到板子上的孔代表可以连接的各种功能。当我看到板子上有标记为Tx0Rx1的孔时,我立刻知道我可以非常容易地将HC-05蓝牙模块连接到这些引脚,并通过蓝牙接收和写入数据。这意味着我可以轻松地向连接了Pro Micro的任何设备发送和接收数据。

灵感迸发

当我读到这块板子和那个ATMega32U4芯片支持USB HID协议时,真正的灵感时刻出现了。太棒了!!!好吧,这可能意义不大,但我知道USB HID意味着USB人机接口设备。而且,人机接口设备意味着它可以像键盘一样工作。

整合

所有这一切都意味着我可以轻松地

  1. 通过Tx => RxRx => Tx(连接发送/接收串行线)将我的蓝牙模块连接到Pro Micro。
  2. 我可以用程序烧写到板载ATMega32U4芯片上,它将从传入的Rx串行线获取接收到的数据。
  3. 然后,程序将通过USB HID将数据输入到连接的设备(计算机)。瞧!您可以从远程配对设备在计算机上打字!
  4. 现在,我所需要做的就是将蓝牙配对代码和蓝牙发送功能添加到我的Android DrawPass应用程序中,我们再也不用输入密码了。此外,您再也不用记住密码了,因为您可以从DrawPass生成它们。另外,您的密码将极其强大。

编程 Pro Micro 再简单不过了

在我之前的文章中,我们学习了使用 USB ASP(串行编程器)设置编程环境的基础知识,这使我们能够运行 AVR Dude 将代码烧录到我们的 ATMega328 芯片上。这一次,由于 SparkFun 工程师的杰出工作,我们所需的一切都已集成在 Pro Micro 开发板上。

您只需要一块 Pro Micro 板和一根 USB 线,一端是常规 USB 连接器,另一端是 micro USB(连接到 Pro Micro 板)。

Arduino IDE(集成开发环境)

您还需要安装Atmel Studio,这样您就可以编写我们的程序并将其烧录到Pro Micro上的芯片中。

您可以从以下网址免费获取IDE:Arduino - 软件[^]。下载后,只需运行安装程序,向导将引导您完成所有步骤。

在 Arduino IDE 中设置 Pro Micro 板

安装 Arduino 后,我们需要将 Pro Micro 设置为它将与之通信的板子之一。这非常简单。只需指向一个 URL,该板子就会作为选项添加。

以下是在IDE中设置Pro Micro板的步骤

  1. 启动 Arduino IDE
  2. 打开 [文件] 菜单项,然后选择 [首选项] 子菜单。
  3. 将出现一个对话框(见下图)。
  4. 将以下 URL(指向一些 JSON 数据)粘贴到“Additional Boards Manager URLS”编辑框中(如下图所示)
    https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json
  5. 点击 [确定] 按钮保存更改,对话框将关闭。
  6. 回到主对话框的主菜单,选择 [工具],然后选择 [板] => 板管理器...(见下图)。
  7. 将出现另一个对话框窗口,如下图所示。注意:您必须输入“sparkfun pro”并单击所示项目,然后才会出现[Install]按钮。
  8. 点击 [安装] 按钮。
  9. 完成后,点击[关闭]按钮。
  10. 现在我们需要选择 Pro Micro 板作为我们要编程的板。再次进入 [工具] 菜单,向下到 [板] 菜单项,当它展开时,列表底部将显示 Pro Micro 板,如下图所示:
  11. 继续选择所示的板子。
  12. 回到[工具]菜单,然后向下到[处理器]菜单项。默认情况下,它会选择旧的3.3伏板,而我们正在使用新的5伏板。
  13. 继续选择5v开发板,我们就设置好了。

 

准备编写Arduino代码

现在我们准备编写 Arduino 代码,它将从串行线(传入 Rx)接收数据并将其写入 USB 键盘。我从 SparkFun 网站的一个示例中获取了一些代码并相应地进行了修改。您可以在以下地址查看原始代码:将您的 ProMicro 变成 USB 键盘/鼠标 - SparkFun Electronics[^] 您可以通过下载本文附带的 Arduino Sketch 文件获取代码(sendKey.zip)。

#include "Keyboard.h"

int incomingByte;
boolean isWriteMode = false;
int writeModeByte[2];
int counter = 0;

void setup()
{
  Serial1.begin(9600); //This is the UART, pipes to sensors attached to board 
}

void loop()
{
  
  
  if (Serial1.available() > 0) {
          // read the incoming byte:
          
          incomingByte = Serial1.read();
          // EDIT - FIRST we check if we are in in (keyboard) write mode
          // To go into WRITE MODE you MUST SEND an ampersand char & (ascii 38) FIRST
          // AFTER IT IS PLACED IN write mode it will stay in write mode as long as the 
          // PRO MICRO has power.
          if (!isWriteMode)
          {
              writeModeByte[counter] = incomingByte;
              if (writeModeByte[0] == 38)// && writeModeByte[1] == 115)
              {
                isWriteMode = true;
              }
          }
          else
          {
          
          // say what you got:
          Serial1.print("I received: ");
          Serial1.println(incomingByte, DEC);
          if (incomingByte != 0) 
          {
            // send char the computer via Keyboard HID
            Keyboard.write(incomingByte);  
            incomingByte =0;
          }
          
        }  
    }
}

代码不多

包含文件

首先要注意的是特殊的包含文件。SparkFun 网站上的示例是错误的,您的草图将无法编译。请确保您像我一样将其放在双引号中,它将与正常的 Arudino IDE 安装一起工作。

这个小草图没什么内容。基本上,我们设置了 Serial1(uart - 通用异步接收器/发送器),它们是 Mega 芯片上的 Rx 和 Tx 引脚。之后,我们进入一个循环,检查每个传入的字节。请注意,之后我们实际上通过 Serial1.print() 写回 uart,这样我们就可以连接一个串行监视器并查看设备收到的内容。但这并不是最重要的部分。

USB HID 键盘

重要的是我们从串行线获取字节,然后将它们写入键盘(通过USB连接)的部分。使用Arduino提供的键盘库,这很简单。

就那一行代码为我们完成了工作:Keyboard.write(incomingByte);

就是这样。现在我们来看看将蓝牙模块连接到Pro Micro板有多容易。

设备接线

现在我们只需将蓝牙模块的串口线连接到 Pro Micro 的串口线。这非常容易,因为只需要两根线。我们还将蓝牙连接到 Pro Micro 方便的 VCC(电源)和 GND(接地)线,这样当 Pro Micro 插入计算机的 USB 端口时,蓝牙就可以通过 USB 连接供电。这真的再简单不过了。

这是我桌上的工作原型。照片质量不佳,但能让您了解大概,接下来我将向您展示Fritzing电路图,以便您了解连接情况。

bluesafekey proto

所有那些电线

基本上,Pro Micro 通过 USB(从电脑)供电。我已经连接到 Pro Micro 上的 VCC 引脚,这样我们就可以为蓝牙模块供电。然后我将 Pro Micro 的 Rx 连接到蓝牙模块的 Tx,将 Pro Micro 的 Tx 连接到蓝牙的 Rx。这就建立了一个完整的串行连接。

大多数电线只是为了让设备在我桌面上时容易保持原位。当然,稍后我们会需要一个完整的、焊接在一起的产品,我们只需将其插入电脑的 USB 端口即可。

这是原理图(关于连接的内容更清晰)。

Fritzing 原理图

这是一个非常容易布线的电路。当然,您还需要将 USB 线从 Pro Micro 连接到您的电脑。

现在我们需要我们的安卓应用程序,它将生成我们的强密码,并允许我们与设备配对并向其发送密码。

安卓应用:DrawPass

注意:对于本文,我只有 DrawPass 的初始原型版本,但我将在未来一两天内更新它。您可以下载源代码(本文附件)并用它生成哈希密码,但还有很多工作要做。

安卓原型代码

我修改了我之前文章中的btFinder,以便我可以连接到蓝牙设备并发送消息。

我使用此应用程序发送消息,然后由 BlueKeySafe 设备将其输入到您的计算机上。它将让您看到 Pro Micro / BlueKeySafe 实际通过蓝牙接收数据并在屏幕上输入字符的运行情况。

您也可以下载该代码并试用。它看起来像这样。连接到蓝牙模块后,在文本框中输入一些字符,然后点击发送键。

如何使用应用程序进行测试

要使用此应用程序,请遵循以下步骤

  1. 选择您要发送到的蓝牙设备(从项目列表中)——当您点击一个设备时,屏幕底部会出现一条消息,因为它最初连接到该设备。这是通过 Tx/Rx 连接到 Pro Micro 的蓝牙设备。
  2. 确保您连接的计算机正在文本文档(记事本)或其他应用程序中,这样当字符传入时,您就可以在那里看到它们。
  3. 编辑 - 已添加此步骤 -- 您必须首先发送一个 &(和号 -- ascii 38)以告知 Pro Micro 它应该开始将后续字符写入键盘
  4. 在 editText 框中输入消息(如图所示)
  5. 按下[发送]按钮。消息将出现在您的电脑上。

结论 1

您可以看到这是一个正在工作的原型,需要进行一些清理,以便最终用户可以极其轻松地使用它。我将在接下来的几天内完成这项工作。我还将创建一个独立的设备,可以轻松插入 USB 并将所有东西 nicely encased(而不是到处都是裸露的电线)。

更多想法:高级创意

BlueKeySafe 的优点

  1. 现在,您可以在任何设备上运行一个应用程序(DrawPass)(一旦我拿到 Mac,iOS 应用程序就会发布),并且再也不用输入密码了。
  2. 在一台计算机上安装 BlueKeySafe,多部手机或设备可以与它配对。当然,一次只能连接一个设备,这样就能确保安全。您可以将这些设备安装在公共图书馆、咖啡店、公司工作站和自助服务终端中,为您的客户提供通过蓝牙发送密码登录其网站的便利。
  3. 要与设备配对,您必须知道蓝牙4位代码,并且必须物理按下一个按钮才能使其进入配对模式。这意味着如果您愿意,可以阻止不必要的用户与设备配对。
  4. 需要管理大量机器的管理员现在可以输入文本密钥来识别他们正在生成密码的计算机和/或服务,DrawPass 将为您跟踪所有这些信息。密码不会保存在任何地方,并且每次按下“生成密码”按钮时都会生成哈希值。这更安全。现在,如果房间里有15台计算机并连接了 BlueSafeKey,您可以直接发送到该设备。或者,更可能的是,如果您通过远程桌面连接,只需在目标计算机的密码文本框中单击,然后在应用程序中按下发送即可。您的长而强的密码就会自动输入。

现在让我们来看看我是如何开发 BlueKeySafe 的,因为我敢打赌你正焦急地期待着消灭所有密码。

安全顾虑

当然,很多人不完全理解安全,他们会立刻开始议论。“这太危险了!!这是一个安全漏洞。”

不,糟糕且创建薄弱的密码才是安全隐患。

但让我们看看一些肯定会出现的问题。

  1. 蓝牙可能被黑客入侵。好吧,到目前为止还没有,而且新的蓝牙是加密的。所以,在我们确定它被正式入侵之前,我们是安全的。无论如何,这意味着有人在蓝牙破解器的物理区域内。有可能,但可能性比互联网入侵要小。
  2. 从剪贴板粘贴密码是极其危险的,这让我头疼。人们认为事实如此,然而,剪贴板受到了很好的保护。如果你有木马病毒,更有可能的是它已经安装了键盘记录器,并且已经在捕获你的按键,所以你已经沦陷了。键盘记录器很简单,也是最常用的东西,所以剪贴板的事情并没有那么糟糕。多读一点就会发现。

终极前沿:它变得更好

多功能小饰品

现在,想象一下我创建一个小巧的、支持蓝牙的小饰品,它带有一个可以计算 SHA-256 哈希值的 Atmel 芯片。接下来,我允许用户只需按下小饰品上的一个按钮,它就会生成哈希值(强密码),并通过蓝牙发送到已配对的 BlueKeySafe。

注意:(这里的挑战将是电池供电的蓝牙模块。R/F 相对于在 1Mhz 下功耗相对较小的 ATMega 芯片而言,是一个耗电大户。)

在接收端,一切工作方式完全相同,因此用户可以轻松登录计算机。

按下小饰品上的按钮进入接收模式:更新盐值

然而,在小饰品端,您可以按下按钮将小饰品置于接收模式(或者可能将小饰品连接到USB端口),以便用户可以随时更新盐值。这意味着用户拥有一个设备,其中包含一个宇宙中其他地方都不存在的独特盐值。此外,小饰品将根据该盐值生成哈希值并将其发送给用户的配对BlueSafeKey。

RADDevus 说
现在用户可以随时生成一个全球唯一的加密强哈希值,用户只需在任何需要生成哈希密码的时候按下按钮即可。

密码存在的唯一地方:小饰品

另外,密码存在的唯一地方(可以从中复制)就是小饰品。

哦不,如果用户丢失了小饰品怎么办?

没错,她将永远无法再次登录——永远无法再次生成哈希值。如果你担心这一点,那就创建一个备用小饰品并将其存放在安全的地方。只需确保每次用新盐值刷新两个小饰品,以保持同步。

场景:为临时访客提供访问权限

假设您的公司有一位访客,您想授予他们访问权限,但又不希望他们创建(可能很弱的)密码。相反,为他们分配一个用户ID,给他们一个小饰品,并允许他们使用该小饰品登录。完成。简单。就应该这样。您的系统中不再允许使用弱密码!!

关注点

阅读本文时,我看到了CP的内部新闻,并发布了以下文章
微软不修复允许黑客窃取用户名、密码和其他登录信息的Windows漏洞 | ZDNet[^]

以下是该文章中的相关引用

ZDNet 称
要利用这一点,黑客必须诱骗用户访问 Internet Explorer 或 Edge(在 Windows 10 上)中一个特制的网页,该网页指向他们自己的网络共享。浏览器将悄悄地将用户名和哈希密码发送到网络共享,然后可以被截取和窃取。如果密码较弱,它们可以很容易地被解密并用于登录用户帐户。

这正是DrawPass和BlueKeySafe为您解决的问题。它们使您的密码极其强大,不易被破解,甚至可能在现实中无法被破解。

密码必须被消灭!!

  1. 用户被迫维护的密码实在太多了。现在的情况已经到了荒谬的地步。我至少有30个不同的账户,30个不同的密码。
  2. 人们在许多网站上使用相同的密码,因为要记住的密码太多了。
  3. 用户创建弱密码是因为他们有太多密码,记不住。
  4. 用户把密码写在便利贴上,放在键盘下面,因为他们记不住。
  5. 用户有太多密码,记不住所有。这导致许多用户创建了日志(打印文档、手写笔记本和电子表格),其中包含他们的密码和网站。太糟糕了!!
  6. 好的(更强的)密码在手机上输入可能会非常困难。这不再是问题,因为您将从手机上的应用程序生成密码并将其粘贴到网站的密码字段中。而且,密码将非常强大——基于加密哈希算法。您将有一个应用程序来生成(而不是存储)您的密码,无论您是在手机上登录还是在台式机、笔记本电脑或其他设备上登录。
  7. 有些管理员拥有多台机器,多项服务和数百个密码,他们必须跟踪这些信息。不再需要这样了!生成您的密码并通过蓝牙发送到目标设备。

结论

我是摧毁弱密码的人

任何人都不应该再自己创建密码了。这样做既危险又单调,只有无知的用户才会再次这样做。管理员应立即禁止少于25个字符的密码以及基于自然语言单词的密码,因为从此以后再也没有必要记住密码了。永远不用!

我们使用基于单词的密码的唯一原因是人类需要助记设备才能记住他们的密码。

有了这个系统,再也没有必要记住密码了,因为你再也不需要记住或输入密码了。

是不是有点极端了?

可能不是,因为这是IT领域的第一大安全漏洞。

零件清单

  1. 蓝牙模块 Amazon.com: DSD TECH HC-05 蓝牙串口透传模块无线串口通信 [^]
  2. Pro Micro 开发板 - Amazon.com: SparkFun Pro Micro - 5V/16MHz[^]

 

历史

更新说明

2016-08-06:我修改了 Sendkey.ino 文件并更新了本文中的代码。之前的代码会在蓝牙连接建立之前从串行线读取随机字节并将其写入用户键盘。这导致垃圾信息被发送到用户的计算机——而不是从配对设备发送的预期数据。

发布说明:为了解决这个问题,Arduino 代码现在会寻找一个起始字符(与号 & ASCII 十进制值 38)。当它看到这个值时,它就知道您想进入写入模式,此后它在串行线上接收到的所有数据都将写入键盘。

首次发布并参加物联网大赛 : 2016-08-05

未来计划

我将在接下来的几天内将所有软件更新为一个完全可用的示例。请持续关注更新。

© . All rights reserved.