销毁所有密码:永远不要再记住密码
一种新颖的安全登录方式,用户再也无需记住密码。该方法可用于任何网站、程序等,并能创建比其他方法更安全的密码。
- 下载 DragPass_v003.zip - 22.4 KB -- 新版本
- 下载 DragPass_v001.zip - 10.6 KB
- 下载 DragPass_v002.zip - 11.6 KB
- 下载 supersimple.zip - 140 B
- 下载 Bluestream.zip - 857.1 KB
第二版简介
画一个图案,生成一个强密码
如果你能在屏幕上画一个图案,然后为每个你登录的网站生成一个强密码(基于SHA256),那会怎么样?
使用最新版本的 DragPass,你就能做到这一点。
如果你读过本文的第一版
视频不怎么样,但只有两分钟长
这里有一个 YouTube 视频链接,展示了它的实际应用和工作原理概述。
dragpass:一种替代(更安全)的密码生成方式 - YouTube[^]
下面是新 UI 的截图。
还有更多要讨论的
如果你已经阅读过本文的第一版,那么有很多改动,你可以点击以下链接直接**跳到新增内容**:第二版从这里开始
如果你还没有阅读本文,请从下面原文的引言开始阅读。本文建立在一个想法之上,最终,它更多的是关于彻底消灭密码的想法,甚至可能超越了其实现。密码必须改变。
第一版简介
本文到底讲了什么?
本文旨在引发以下主题的讨论
1. 密码很烦人,并因各种原因导致漏洞。
2. 为什么我们要求用户记住和创建密码,而他们显然无法创建强密码?
本文的主要焦点
我向您展示了完整的 C# 代码,它创建了一种**生成用户从未知道、无需记忆甚至从未见过的强密码的方法**。我知道某处可能有人已经想到过这一点,但我还没有看到有人讨论,所以我希望本文能帮助引发这场讨论。
我还希望收集意见,因为我的密码生成方式可能(有?)一些缺陷。您认为我的方法有什么漏洞?
背景:是什么让我开始思考密码
考虑非技术用户(互联网上99.9%的人)
首先,你必须考虑所有非技术用户。对他们来说,密码是一种烦恼,他们中的大多数人要么把密码写下来,要么只是为所有网站使用一个密码。这两种选择都会造成漏洞。
然后,最近在 VirusTotal.com 上检查文件时,我突然想到
引用您计算机上的任何文件都可以是一个唯一的密码。
什么?让我解释一下这个想法是如何产生的。(*我将以我的想法的逐步说明方式来写,所以请坚持下去,即使你注意到最初的想法可能看起来是错误的,也请继续。)*
周五,我在思考 VirusTotal 用来识别文件的 SHA-256 哈希算法。
如果您访问VirusTotal - 免费在线病毒、恶意软件和 URL 扫描器[^]并上传一个文件,您就可以看到它的实际运行。
我从我的 Toshiba 笔记本电脑上传了 Bluestream.bmp,VirusTotal 已经知道这个文件,因为之前有人上传过。
单向哈希对每组字节都是唯一的
为 Bluestream.bmp 文件中的字节集唯一生成的 SHA-256 哈希是
6f6045a6e3449df05def5542c0a79127d2688a49672ad820a42ef659a81409f4
如果您更改该文件中的一个字节,它将生成一个完全不同的哈希。让我向您展示从某些字节生成哈希的代码是多么简单。
// using System.Security.Cryptography
SHA256 mySHA256 = SHA256Managed.Create();
// convert string into bytes
byte [] allBytes = Encoding.UTF8.GetBytes("super simple");
// compute the hash for the bytes provided
byte [] hashBytes = mySHA256.ComputeHash(allBytes);
StringBuilder outstring = new StringBuilder();
// create a string of hex values for output
foreach (byte b in hashBytes ) { outstring.AppendFormat("{0:x2}", b);}
Console.WriteLine(outstring.ToString());
第一行创建了一个对象,该对象用于为您运行 SHA-256 哈希算法。
第二行简单地从字符串“super simple”创建一个字节数组
第三行将字节数组传递给 SHA256 对象的 ComputeHash()
函数。
ComputeHash()
返回一个表示唯一哈希值的字节数组。然而,这些字节可能包含不可打印的字符,因此我们必须将它们转换以确保它们可显示。为此,我遍历每个字节并调用 StringBuilder
方法 AppendFormat()
。格式说明符 {0:x2} 将输出格式化为两位十六进制值。此格式将与 VirusTotal 使用的格式匹配。
最后,我使用 Console.WriteLine() 打印出值。
您的计算机上对于这些字节的输出将与我的完全相同,即
3ea0100a11a0e118e2e8eabe2e5d723b6836151b39843347f84ea361a3757fa4
以不同的方式思考密码
密码最大的问题之一是
用户创建弱密码
用户根据他们能记住的常用词汇创建糟糕的密码。
根据自然语言中发现的单词创建糟糕的密码,这使得黑客可以对密码进行字典攻击。换句话说,黑客可以不断猜测单词或单词对,直到猜到用户的密码。
密码的另一个主要问题是
要求用户知道他们的密码会造成漏洞
由于用户必须记住他们的密码,他们最终会创建弱密码(以便记住它们)。或者,他们最终会把它们写下来。将它们保存在文件中或使用其他方法,这些都会造成额外的漏洞。
VirusTotal 如何哈希文件
您刚刚看到的代码和 VirusTotal 的代码之间的区别在于,VirusTotal 对文件(而不仅仅是字符串的几个字节)生成了哈希。这仅仅意味着 VirusTotal 从文件中读取字节,然后对上传文件包含的字节生成哈希。
更改我们的代码使其能够从文件读取字节非常容易。它只需一行代码更改(请参阅以下代码示例中的粗体行)
// using System.Security.Cryptography
SHA256 mySHA256 = SHA256Managed.Create();
// convert string into bytes
byte [] allBytes = File.ReadAllBytes(@"c:\temp\supersimple.txt");
// compute the hash for the bytes provided
byte [] hashBytes = mySHA256.ComputeHash(allBytes);
StringBuilder outstring = new StringBuilder();
// create a string of hex values for output
foreach (byte b in hashBytes ) { outstring.AppendFormat("{0:x2}", b);}
Console.WriteLine(outstring.ToString());
我正在使用静态类 System.IO.File
调用 ReadAllBytes()
方法,该方法将文件的字节读取到字节数组中,非常方便。
supersimple.txt 生成完全相同的哈希
我使用 Notepad++ 创建了一个包含完全相同字符串“super simple”的文件,并将其保存到文件中。
这意味着哈希的是完全相同的字节,因此当我们运行此代码时,您会得到与之前生成的相同的哈希值
3ea0100a11a0e118e2e8eabe2e5d723b6836151b39843347f84ea361a3757fa4
您可以下载 supersimple.txt
(本文顶部的 zip 文件)并亲自尝试。只需确保相应地更改文件路径。此外,请确保您首先解压缩文件。如果您对压缩文件运行哈希,您将得到不同的哈希,因为字节不同。该 zip 文件的哈希值为
32bdbe113b9d2565755596aa4afb420095a261d3f1caa623525e488b774b85c0
已将 supersimple.txt 上传到 VirusTotal.com
我将 supersimple.txt 文件上传到 VirusTotal.com。您可以在下面的快照中看到,它生成了相同的哈希值。
VirusTotal 通过其唯一的哈希值识别文件
如果您上传 supersimple.txt,它会告知您它之前已经扫描过该文件。它之所以能做到这一点,是因为它根据从文件字节生成的唯一哈希值来识别文件。
想象力的飞跃:渴望简单
这意味着,如果我们能为用户提供一种简单的方法,让他们指向一个文件并生成一个唯一的哈希值,我们就可以为该用户创建一个非常复杂的密码(哈希值)。想象一下这对于用户来说会多么简单。她所要做的就是记住一个她用作密码生成器的文件。她永远不必记住任何复杂的密码或写下任何东西。
但是,我们能为用户创建一个简单的程序来做到这一点吗?绝对可以。
下载工作程序:版本 1
您可以下载 DragPass_v001.zip 以获取本节的代码。
DragPass 是做什么的?
我称之为 DragPass 的程序允许用户拖动任何文件并将其放到表单上。当用户这样做时,SHA256 哈希值将从文件中的字节生成,然后显示在文本框中(如果选中了复选框)。
复制到剪贴板:它还会将值复制到剪贴板,这样即使不显示哈希值,用户也可以简单地将其粘贴到网站的密码框中即可。
您可以看到我将 supersimple.txt 文件拖放到表单上,它生成了相同的哈希值。
为计算机上的任何文件生成哈希
您可以打开文件资源管理器,将计算机上的任何文件拖放到此程序中,它将为其生成 SHA256 哈希。这很酷。
拖放桌面快捷方式
该程序的一个额外巧妙功能是,您可以将任何桌面快捷方式拖放到其上,它也会生成哈希代码。这可能是一种让您的*密码*易于使用的酷方法。只需生成一些快捷方式,分配一个图标,然后将它们拖放到表单上,并将生成的哈希用作您的密码。
表单中包含的代码
我基本上只是将我们之前的代码封装在一个表单中,并使其在文件拖放到表单上时运行。我们不必编写太多代码来创建应用程序,所以我让您在代码下载中查看它。拖放部分是代码中最有趣的部分,所以我们来看看它。
拖放很容易
基本上,您只需在表单构造函数中注册表单以接收拖放事件,然后处理这些事件。
这是构造函数的样子
public MainForm()
{
InitializeComponent();
this.AllowDrop = true;
this.DragEnter += new DragEventHandler(MainForm_DragEnter);
this.DragDrop += new DragEventHandler(MainForm_DragDrop);
}
在这种情况下,this
变量是 MainForm,所以我们注册它以允许拖放事件。
之后,我们为每个事件设置 EventHandlers。最后,我们编写了为这些事件运行的代码。
void MainForm_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy;
}
void MainForm_DragDrop(object sender, DragEventArgs e)
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
foreach (string file in files)
{
var m256 = SHA256Managed.Create();
byte[] allBytes = File.ReadAllBytes(file);
byte [] hashBytes = m256.ComputeHash(allBytes);
StringBuilder pwd = new StringBuilder();
// create a string of hex values for output
foreach (byte b in hashBytes) { pwd.AppendFormat("{0:x2}", b); }
if (showPasswordCheckBox.Checked)
{
passwordTextBox.Text = pwd.ToString();
}
Clipboard.SetText(pwd.ToString());
}
}
DragEnter EventHandler 更改光标,以便用户知道正在发生某些事情。
当然,您可以看到 DragDrop EventHandler 运行用于打开文件、获取字节和生成 SHA256 哈希的代码。最后,我们将哈希复制到剪贴板,以便轻松用作密码。
这种方法有什么缺点?
然而,您可能会想:“嗯,这似乎不安全,因为黑客可以访问我的计算机并对我所有文件生成哈希。”
是的,这是真的,但是,他们必须尝试将这些哈希中的每一个都与您的用户帐户进行比较,以查看它是否也有效。这可能不太可能,但让我们再增加一层安全性,我们还将了解更多关于哈希的知识。
添加“盐”以增强安全性
下载
您可以从本文顶部下载 DragPass_v002.zip 文件,查看完整的代码。
好的,既然黑客可以为您的每个文件生成哈希值,那么让我们通过给哈希值加盐来增加另一层安全性。什么是给哈希值加盐?这是一种简单的方法,通过允许用户将新字节插入到被哈希的字符串值中,从而为单向哈希算法增加另一个复杂性因素。
哈希的两个因素
基本上,您允许用户添加一些字节,从而使哈希的最终输入不同,这显然会导致最终哈希不同。这要求黑客不仅能够哈希您计算机上的每个文件以获得最终哈希,因为现在哈希不仅基于文件,而且还基于一些额外的字节。
我们将允许用户用什么来加盐?
我建议我们只让用户选择两个文件来创建哈希。计算机上大量的文件将使黑客几乎不可能猜到选择了哪两个文件来生成密码。首先,让我们从用户的角度看看程序是如何工作的,然后我们可以讨论简单的代码修改。
拖放一个未加盐的文件:用于比较
以下是版本 2 中当您将同一个 supersimple.txt 文件拖放到其上(但不生成盐值)时程序的样子。
既然我现在允许用户拖放两个文件,我必须为她提供单独的区域来完成。我创建了两个分组框,现在每个分组框都有单独的拖放事件。在这个例子中,我将 supersimple.txt 拖放到右侧的分组框中,并创建了一个未加盐的哈希。这就是为什么哈希值与上一个示例中相同的原因。
现在,我将一个快捷方式拖放到左侧分组框中,以设置盐值(用户永远不会看到),然后我将相同的 supersimple.txt 文件拖放到右侧,您会看到最终的哈希值完全不同,因为它已经加盐了。
您可以看到 supersimple.txt 的哈希值已更改为
0ab7d9aad8606c99fd4a918fd638a1282df5cf4e519eb5c5a71da556b14ded3d
您将无法重新创建该值,因为您不知道我用于加盐的文件,所以我已将其包含在代码下载中。我使用的盐文件名为 salt.txt
。
使用新文件生成新哈希
每次您将新文件拖放到右侧时,都会使用相同的盐文件生成新的哈希值。
这使得一次设置盐值然后从多个文件生成哈希变得更容易。
更改盐文件
如果您想更改盐文件,可以右键单击左侧,将出现一个菜单项,允许您清除盐文件,这样您就可以
- 创建不加盐的哈希
- 添加新的盐,用于后续的哈希创建。
用户需要记住的更少,密码更安全
想想这些好处。
- 通过这种方法,用户可以更容易地生成更安全的密码(不基于自然语言)。
- 用户只需记住两个文件即可生成密码。他不必被迫记住冗长复杂的密码。
设想多设备下的完整场景
假设用户被指示选择一个文件作为盐。用户可以用手机拍一张照片,然后用它作为盐。
从 Google Drive (Dropbox, OneDrive 等) 提供盐
之后,他可以将文件传输到他的 Google Drive,我们可以创建一个方法让用户从他的 Android 设备、笔记本电脑或他正在使用的任何设备中选择该文件。就像他从本地机器选择盐一样。然而,这个远程位置将提供另一层安全性,因为即使黑客入侵了他的电脑,黑客也不一定能访问远程驱动器或文件。
相同的文件,生成相同的哈希(密码)
因为相同的文件生成相同的哈希,我们将其用作密码,所以只要用户拥有这些文件,她就可以从任何地方生成她的密码。
SHA256 是一种标准算法
由于 SHA256 是一种标准算法,我可以在任何平台上编写哈希创建代码,这样用户可以轻松地从她的 iPhone、Android 手机、Windows 笔记本电脑或任何设备中选择两个文件,随时生成她的密码,这样她就可以从她的任何设备登录到她的任何网站,并且比以往任何时候都更安全。
可能存在的危险是什么?
如果用户试图通过不谨慎地命名密码和盐文件(例如 myPwdFile.jpg 和 saltfile.png)来记住它们,那么黑客可能很容易找到这两个文件。
您能想到与此相关的其他安全漏洞吗?如果您有,我希望您能回复。
面临的挑战是什么?
用户教育是最大的挑战。您必须向他们解释,创建的密码永远不需要存储在任何地方。那是因为每次用户登录时都会生成它。她只需将相同的两个文件拖放到界面上,密码就会生成并复制到剪贴板,以便粘贴到登录表单的密码字段中。
让人们使用它
让人们使用它(营销)总是最困难的事情。大多数非技术用户根本不知道这可能会创建比他们现在创建的任何密码都更强的密码。它可能确实如此。
密码要求
此外,有些网站可能对密码有特殊字符或一些无意义的要求。我想我们可以添加一个功能,在哈希的末尾添加一个特殊字符,然后应用程序每次都会使用相同的字符来满足网站的要求。
反馈:征求意见
我希望这激发了您对如何创建更安全的密码的想象。我希望如果我错过了任何巨大的漏洞,您会回复并开始讨论。我认为这是一个引人入胜的话题,改变现代计算中这个有问题但核心的元素的挑战是一个有趣的挑战。
修订版 2 从这里开始
现在支持以下请求的功能
最大的变化是现在您只需绘制一个图案(您每次都会重复),它就是生成哈希的一部分(文章中将有更多解释)。
- 根据您的隐藏令牌信息(文件、绘制的图案等)为多个站点生成不同的密码
- 密码中添加大写字母
- 密码中添加特殊字符
- 能够通过 URL 使用远程文件作为哈希的盐
- 当然,您的密码不会保存在任何地方,而是每次都会生成(文章中会有更多内容)
积极的响应令人惊叹
这篇文章非常有趣,因为很多优秀的人都参与进来,为讨论增添了许多精彩的想法。
这就是我添加所有这些新功能的原因。
您无需记住任何字符即可创建和重新创建密码
相反,现在你只需记住你在网格上画的图案。
新 DragPass 的一般工作原理
新的 DragPass 应该改名为 DrawPass,因为现在你基本上可以画一个独特的图案并生成一个基于哈希的密码。
生成密码需要两样东西
生成密码只需要两样东西
- 站点密钥 - 任何文本,可以帮助您记住要登录的站点
- 一个绘制的图案
站点密钥是什么?它有什么作用?
站点密钥是任何可以帮助您记住密码用途的文本(字符串)。
您可以在左上角的 ListBox 中输入这些列表
这会让许多人的大脑融化
当您添加每个站点/密钥时,该项目将添加到与您启动 DragPass 的目录相同的名为 dragpass.json
的文件中。
DragPass.json 是什么?它有什么影响?
该项目实现了 NewtonSoft JSON 库,通过 Nuget(包管理器)获得。
这只是让用户可以轻松添加她的站点列表,以便她可以轻松地为它们生成密码。
天哪!破解者获得此文件(站点列表)怎么办?
让大脑融化开始吧!
有不少人担心破解者(他们其实不是黑客)会入侵用户的机器并读取他们的文件。我理解。这确实会发生。特洛伊木马病毒无处不在。然而,如果破解者在你的机器上,那么他可能已经安装了键盘记录器,那在获取密码方面会更有效。
即使破解者获得了您的 JSON 文件
请记住,JSON 文件中的数据是创建密码时使用的盐的一部分,但它只用于用户可以通过一个模式创建多个密码。
请记住,生成基本密码需要两个必需值,因此即使他们拥有您的 JSON 站点条目,他们还需要为所有可能的(几乎无限的)图形模式生成所有值。
哎……但唉,我预计对此(以及我们将在文章其余部分阅读的其他内容)会有大量的争论。
合作的好处
这很好,因为我们都在共同努力,为用户创建一个更好的系统,永远消灭糟糕的密码。
继续我们的讨论,一旦您有了列表项,您只需点击相应的项即可生成密码。
此时如果您点击 [Gen Password]
按钮,它会警告您需要绘制一个图案。
您输入到该列表框中的文本将被转换为字节并用于生成哈希。
画一个图案
现在,您需要在右上角的网格中绘制一个图案。您所要做的就是依次点击任何网格点,线段就会开始绘制。一旦您至少有一个线段,您就可以点击 [Gen Password]
按钮,就会生成一个唯一且强大的密码。
如何在网格上绘图生成哈希值?
这是代码中一个有趣的部分,所以我们需要讨论在用户只执行以下操作(没有其他选项)的情况下最终哈希是如何生成的
- 选择一个站点
- 绘制一个图案
用于组织的领域类
我创建了一些类来帮助我保持一切井井有条。这些类来自对问题域的分析。它们非常简单,但允许新接触代码的人更容易地剖析代码以了解其作用。由于这是一个新兴的想法,我希望代码尽可能透明。
class LineSegment
{
public Point Start { get; set; }
public Point End { get; set; }
public LineSegment(Point start, Point end)
{
Start = start;
End = end;
}
}
我创建了一个 LineSegment 类,只是简单地封装了几个 Point 对象,它们将在屏幕上创建线条。
我还创建了该类的复数形式(LineSegments
- 注意“s”),它具有一些附加功能(与生成将用于创建哈希的值有关)。
class LineSegments : List<LineSegment>
{
public String PostPoints { get; set; }
public int PostValue { get; set; }
public void AddOn(int pointValue)
{
PostValue += pointValue;
PostPoints += String.Format("{0},", pointValue);
}
}
这个类是第一个类的列表。我们就是这样跟踪用户绘制的所有线条以创建她的图案的。
你可以看到还有几个属性(PostPoints
和 PostValue
)。最初我使用 PostPoints 进行调试,这样我就可以测试无论用户如何绘制形状,我都能每次都生成相同的值。
PostValue
我们感兴趣的属性是 PostValue
。它的命名不是很好。它应该与我称之为网格上的红点(posts)相关联。
在 Windows 窗体上绘图
仅仅为了让用户在 Windows 窗体上绘图,就有相当多的代码,但我不会详细介绍所有这些。您可以自己检查。在 MainForm 中,您会找到重要的方法(可能应该在领域类中),名为 CalculateGeometricSaltValue()
private void CalculateGeometricSaltValue()
{
LineSegments.PostPoints = String.Empty;
LineSegments.PostValue = 0;
foreach (LineSegment l in LineSegments)
{
for (int x = 0; x < allPosts.Count; x++)
{
if (l.Start.X == allPosts[x].X && l.Start.Y == allPosts[x].Y)
{
System.Diagnostics.Debug.Print(string.Format("START x : {0}", x));
LineSegments.AddOn(x);
}
if (l.End.X == allPosts[x].X && l.End.Y == allPosts[x].Y)
{
System.Diagnostics.Debug.Print(string.Format("END x : {0}", x));
LineSegments.AddOn(x);
}
}
}
System.Diagnostics.Debug.Print(String.Format("Value : {0}",LineSegments.PostValue));
System.Diagnostics.Debug.Print(LineSegments.PostPoints);
}
我在此方法中执行以下操作
- 确保 LineSegment 只添加一次——即使用户尝试多次在其上绘制。
- 计算用户绘制的几何图形的 PostValue。
一旦生成了该点值,我们就可以在以后创建哈希时将其用作盐。
可选项目
由于许多网站对密码强制执行特定要求,我添加了以下功能:
- 添加大写字母
- 添加一个或多个特殊字符
- 设置最大长度——在我看来,网站这样做很奇怪,因为它限制了许多事情。
这是一个未开启额外选项时生成的密码,然后是开启额外选项后相同的密码(仔细看,你会看到一个大写字母和其他字符)。
选择所有选项后
您可以在 MainForm 方法中查看创建哈希的概览,该方法在点击 [Gen Password] 按钮时触发。
private void GenPasswordButton_Click(object sender, EventArgs e)
{
CalculateGeometricSaltValue();
if (SiteListBox.SelectedIndex < 0)
{
MessageBox.Show("You must select a Site/Key item to generate a password.");
return;
}
if (LineSegments.PostValue == 0)
{
MessageBox.Show("You must create a pattern to generate a password.");
return;
}
ComputeHashBytes();
if (addUpperCaseCheckBox.Checked)
{
AddUpperCaseLetter(pwdBuilder);
}
String pwd = pwdBuilder.ToString();
if (AddSpecialCharsCheckBox.Checked)
{
pwd = AddSpecialChars(pwd);
}
// this trimming code should be called after everything else
if (SetMaxLengthCheckBox.Checked)
{
// Math.Min insures we don't overflow bounds of string
pwd = pwd.Substring(0, Math.Min((int)MaxLengthUpDown.Value,pwd.Length));
}
if (showPasswordCheckBox.Checked)
{
passwordTextBox.Text = pwd.ToString();
}
Clipboard.SetText(pwd.ToString());
}
基本步骤是
- 计算几何盐值——如果用户没有绘制,则会警告他必须绘制
- 计算哈希字节——使用用户选择的所有项目创建加盐的哈希,每个必需和可选项目都作为盐。
- 添加任何特殊字符,大写字母
- 根据需要限制长度
现在,让我们来看看哈希是如何实际生成的,我们将查看其他可选项目(使用远程文件和/或本地文件)。
计算哈希字节
这就是哈希实际生成的地方。当然,会根据用户是否选择了某些可选项目(例如使用远程文件和/或本地文件)而撒上不同量的盐。
private void ComputeHashBytes()
{
var m256 = SHA256Managed.Create();
var patternBytes = System.Text.Encoding.UTF8.GetBytes(LineSegments.PostValue.ToString());
var selItemText = SiteListBox.SelectedItem.ToString();
var siteBytes = System.Text.Encoding.UTF8.GetBytes(selItemText);
byte[] allBytes = null;
if (SaltIsSetCheckBox.Checked)
{
allBytes = new byte[patternBytes.Length + siteBytes.Length + saltBytes.Length];
patternBytes.CopyTo(allBytes, 0);
siteBytes.CopyTo(allBytes, patternBytes.Length);
saltBytes.CopyTo(allBytes, patternBytes.Length + siteBytes.Length);
}
else {
allBytes = new byte[patternBytes.Length + siteBytes.Length];
patternBytes.CopyTo(allBytes, 0);
siteBytes.CopyTo(allBytes, patternBytes.Length);
}
if (remoteFileUrlTextBox.Text != string.Empty && remoteFileData.Length > 0)
{
if (remoteFileData.Length > 0)
{
var remoteBytes = System.Text.Encoding.UTF8.GetBytes(remoteFileData.ToString());
byte [] tempBuffer = new byte[allBytes.Length + remoteBytes.Length];
allBytes.CopyTo(tempBuffer, 0);
remoteBytes.CopyTo(tempBuffer, allBytes.Length);
allBytes = tempBuffer;
}
}
byte[] hashBytes = m256.ComputeHash(allBytes);
pwdBuilder = new StringBuilder();
// create a string of hex values for output
foreach (byte b in hashBytes) { pwdBuilder.AppendFormat("{0:x2}", b); }
}
远程文件字节:那是什么?
我添加了一个功能,允许您指向一个远程文件,以便为哈希添加额外的盐。
您可以从浏览器的导航栏中获取一个 URL,然后将其拖到文本框中,它就会被粘贴进去。
当我拖入一个来自我的 Google Drive 的文件夹时,它看起来是这样的
我好害怕!请抱紧我
有人首先会想:“这太疯狂了!你正在通过网络传输字节,破解者可以嗅探这些数据并获取你的文件。”嗯,是的!
使用 HTTPS:不错的解决方案
除非您使用的是 HTTPS 的 URL,否则破解者无法嗅探文件字节并获取它们。而且,**如果她能,那么整个互联网就完蛋了!!** :)
接下来你可能会说:“但是那个文件可能会改变,然后你就无法重新创建你的密码哈希。”
文件可能更改
你又说对了。然而,想象一下,如果你把一个只有你拥有链接(并且包含 HTTPS URL)的文件放到你的 Dropbox、Google Drive、Live Drive 等中,那么你就可以安全地这样做,以进一步给你的哈希加盐。
文件损坏随时可能发生,因此这始终是一个问题。请根据需要保护自己。但是,您从互联网上的远程位置获取的文件有多少次会损坏?大多数情况下很少。而且,**无论如何,您都应该经常更改密码**,即使采用这种出色的新密码生成方式。
本地文件作为盐
您仍然可以使用本地文件作为盐。就像以前一样,将其拖放即可。
多种盐因素使其相当强大
现在,如果您真的想,可以使用所有四个因素来加盐您的最终哈希值
- 站点密钥 - 必需
- 几何图案 - 必需
- 本地文件
- 远程文件
有四个因素使其对破解者来说更困难
你看,现在破解者必须尝试无限多的变种,以至于**尝试破解你的密码根本不值得花费时间。**
真正的密码学:真正的密码学家知道什么
这就是真正的密码学家所知道的。一种加密方法只需在一定时间内足够强大即可。这就是为什么密码学方法基于时间和处理能力。
信息有有效期
您拥有的信息有有效期。这意味着如果破解者需要 6 个月才能生成您的密码,那么您应该每 5 个月更改一次,这样您就安全了。即使是现代密码学方法也因处理能力而受到审查。
可能足够强大,可能比您使用的更强大
这种方法可能创建了一个比您当前用于创建密码的方法更强大的方法(或者至少比 90% 的用户更强大)。
一个破解者花费如此大的精力来破解一个密码是极不可能的。(哦,这会让人们陷入中风般的眩晕!!):)
可能存在的弱点
几何值生成
破解者可能会通过研究 LineSegment 创建和 PointValues
来生成大量代表各种几何值的值。可能性不大,但我们知道那些破解者是无聊的人。
JSON 站点文件
我们将来可以加密该文件,使其只能在其创建的系统上读取。这是一个可能的漏洞,还有一些其他想法可以保护它。
结论
我希望您能以全新的视角看待密码。
我希望您真正阅读了这篇文章,并思考它可能正确的地方和可能错误的地方。我非常喜欢关于这个话题的讨论。有那么多优秀的人提出了友善的评论。
我希望我们都思考更好的密码方法,因为用户(通常)没有创建安全的密码,并且到处使用相同的密码。
我希望您能尝试这个软件并加入讨论。
一些困惑/担忧之处
我将这些作为快速笔记添加,以展示一些出现的问题以及它们背后的一些想法。请随意讨论其中任何一个。
复制到剪贴板
有些人认为这很危险。然而,剪贴板受到了很好的保护,而且,当然,如果有人在您的机器上并且能够读取您的剪贴板,那么无论如何您都完蛋了。 :)
但是,如果您不喜欢复制到剪贴板的部分,那么您可以删除该代码。
由文件字节生成的密码引起了一些人的担忧
这个很有趣,因为在第一次修订中,我向您展示了如何简单地选择两个文件(一个作为盐,另一个作为哈希)来生成密码。
一些人完全不同意,因为他们认为有人可以
- 获取你所有的文件
- 只需遍历每个文件,并将其与另一个文件配对,然后生成你的哈希值。
该理论存在的问题
- 黑客已经入侵你的机器(如果她能访问你的所有文件)。如果这是真的,你就完蛋了,因为黑客已经安装了键盘记录器并获取了你的密码。:)
- 通过将每两个文件(也包括两种顺序)配对来生成所有可能的哈希值将花费很长很长的时间
- 即使黑客确实生成了天文数字的哈希值,她也无法判断哪个是正确的,直到她尝试使用每个哈希值登录你的帐户。当她尝试了数百万个哈希值时,她肯定会被锁定。:)
为什么这些基于哈希的密码不那么安全?
我不确定为什么基于 SHA256 哈希(目前被认为是密码安全的,并被整个 IT 行业使用)的密码会比某人凭空想象的密码更不安全。
历史
文章第二版:2015-06-03 - 代码发布 DragPass_v003.zip(文章顶部)
文章和代码首次发布:2015-05-16