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

100亿密码泄露?你真的了解密码破解吗?真的吗?

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2024年7月9日

CPOL

11分钟阅读

viewsIcon

3926

downloadIcon

72

让我们看看密码破解到底意味着什么,以及如何让你的密码更安全——可能100%安全。

GitHub - raddevus/CYaPass-Electron: The official C'YaPass desktop app built on Electron (runs on Windows, Linux, Mac)[^]

引言

如果你了解密码是如何被破解的,你将再也不会在密码中使用自然语言词汇。仅仅这一点就可能让你完全安全。是的,我将在文章后面解释这如何让你安全。

我将采取一种另类视角,以便我们能更深入地思考密码破解的真正含义,以及密码是否完全无法使用。

背景

所有的安全专家都告诉你密码是一种失败的技术,因为有太多密码被破解了。但是,为什么他们从不清楚地解释密码是如何被破解的呢?

似乎有一种运动正在试图摆脱你拥有的密码。

夸张的报道

问题之一在于,新闻以一种夸张的方式报道低级技术问题(“听起来高大上但没什么意义”。

看看今天领英上的这篇文章。

Nearly 10 billion passwords leaked | LinkedIn[^]

 

100亿密码!?什么?

我们现在就来解剖那篇文章,好吗?

文章指出:

引用

“……近100亿个独一无二的密码被发布到了一个黑客论坛上”

这让你觉得有100亿个明文密码可以直接使用。

然而,这不可能是真的。因为如果是这样,那么文章中的其他句子又意味着什么呢?尤其是最后一句话

“……它可能支持“暴力破解攻击”,这种攻击通过试错法快速尝试大量密码,从而访问未受保护的系统。”

当攻击者已经拥有明文密码时,他们为什么还需要进行“使用试错法的暴力破解攻击”呢?嗯,那是因为他们并没有。

这是煽动性的报道。我查看了链接到源文章(在 qz.com 上)的文章,那篇文章更短,而且根本没有解释清楚。所以,他们根本没有发布100亿个明文密码。

但你早就知道记者根本不做任何实际工作。他们只是编造句子,然后其他“新闻”网站会引用这些信息并重复传播,这会给信息增加份量,因此真相不再重要。只要有耸人听闻的标题,你就赢了。

他们从不解释的事情

新闻报道通常会提到这类数字,而且是关于弱密码,对吗?

很明显,很多这些账户和密码只是用于虚假账户或“一次性”账户,用户创建这些账户是为了快速了解公司信息或获取免费物品等。

要点:带有弱密码的虚假账户

所以,即使存在像(password1, abc123)这样的弱密码,他们没有向读者解释的是,有数百万的账户是由一次性用户创建的,还有一些是由黑客创建的,这些用户根本不在乎密码。

是的,普通人也会创建弱密码

是的,我知道,普通人会创建糟糕的密码。但是,他们可以做一件简单的事情来使他们的密码安全:永远不要在密码中使用自然语言词汇。

解决方案

相反,创建一个完全随机的字符集作为你的密码。

问题

普通用户将无法记住随机字符集。

显然,可以通过强制用户使用密码管理器来生成随机密码来解决这个问题。

奇特的解决方案:仓鼠法

这里有一个方法可以使普通用户的账户几乎完全安全。请评论并参与讨论,论证为什么这可能不正确。

以下是步骤:

让仓鼠在键盘上跑动,为用户的电子邮件主账户创建一个随机密码。

  1. 我刚把我的仓鼠丢在键盘上,得到了: adgy788t6ops;ldfkyudt621@DCG32#@&
  2. 用这个作为她电子邮件账户的主密码。这样她的主电子邮件账户就可以用一个随机的强密码来保护。
  3. 把这个写下来,放在一个密封的保险箱里——总有一天用户会记住它。
  4. 之后,用户每次创建新账户时,都应该再次把仓鼠丢在键盘上生成密码,但是这些账户不需要写在任何地方?什么?
  5. 每次用户登录任何其他账户时,她都会简单地说,“哦,我不知道我的密码,请重置账户”,然后发送到她的主电子邮件账户。
  6. 她将从主电子邮件账户中检索重置信息并登录。
  7. 现在只有一个主密码需要记住/使用,而其他所有密码每次都会被重置。
  8. 这难道不是很天才吗?!

我的观点是:如果没人知道你的密码(包括你自己),那么它就是安全的

我的真正观点是:随机!

我的真正观点是,密码必须是随机的,这样才无法被猜测。

但是,为了更好地陈述这一点,我想说:

密码不得包含任何可被检测为模式的模式。

这才是真正的随机。

破解者如何破解密码

人们似乎忘记了破解者是如何实际破解密码的。

忽略明文存储

让我们忽略那些以明文形式存储你密码的公司,好吗?它们还存在吗?我希望没有。如果存在,那你可就惨了。这是无法避免的。破解者会破解,然后他们会得到一个明文密码的宝库。

生成所有哈希值并进行比较

破解者获取密码的真正方式是:

  1. 编写一个算法,该算法**对可疑密码和密码短语进行哈希处理**,生成一个巨大的哈希数据库。
  2. 将这些哈希值与他们在从公司窃取的文件中找到的哈希值进行比较。

就是这样!

考虑 SHA256 哈希的大小

所以,256位值就是 2^256 的值。

最大值是:

115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,935

我们把这个数字称为 HUGE-NUMBER。

从袋子里拿出一个随机物品

想想这个实验。

  1. (不看)从一个装有 HUGE-NUMBER 个物品的袋子里随机拿出一个物品。
  2. 将物品放回袋子,与其余 HUGE-NUMBER 个物品混在一起。
  3. 第二次(不看)伸手,尝试随机再次拿出同一个物品。理论上是不可能的!

这为什么很重要?

这很重要,因为任何唯一的输入都会产生一个新的、唯一的输出。目前,SHA256 算法没有任何已知的碰撞。

这一切为什么重要?

它很重要,因为我们将使用 SHA256 哈希作为我们的密码。

为什么?因为 SHA256 值是随机的。这相当于让一个仓鼠在键盘上跑来跑去生成一个密码。

但是 SHA256 哈希是如何生成的?

嗯,我们不必确切了解 SHA256 算法的底层细节,但我们需要知道如何生成一个。

我们可以使用包含 SHA256 算法的库来生成 SHA256 哈希。

微软提供了这样一个库,你可以通过 PowerShell 访问它。

用于从任何文本创建 SHA256 的 PowerShell 脚本

param (
  [string]$target = $(Read-Host)
)
$stringAsStream = [System.IO.MemoryStream]::new()
$writer = [System.IO.StreamWriter]::new($stringAsStream)
$writer.write($target)
$writer.Flush()
$stringAsStream.Position = 0
$outHash = Get-FileHash -InputStream $stringAsStream | Select-Object Hash
$outHash.hash.ToLower()
  1. 首先,我们在命令行中读取用户提供的字符串值 ($target)。
  2. 接下来,我们设置一个 StringStream 并将值设置为用户提供的字符串 ($target)。
  3. 接下来,我们调用 Get-FileHash(生成 SHA256)并将用户提供的字符串传递给它。
  4. 最后,我们为了保持一致性而将哈希值转换为小写。

这里有一些我为你哈希过的词。我在我的 Ubuntu 22.04.4 系统上运行了它。

长度为 64 个字符

哈希值长度为 64 个字符,因为 32 个字节(256 位 / 8 位 = 字符数 = 32)中的每一个都由一个 2 字符的十六进制值表示。

获取源代码(在文章顶部),你也可以尝试一下。

这里有一个随机词列表及其 SHA256 哈希值。

我自己的建议

我的建议是,不要自己编造密码,而是生成一个 SHA256 哈希值并将其用作你的密码。

破解者也能生成相同的哈希值吗?

但是,等等,难道别人不能使用我用来生成 SHA256 哈希值的相同单词,然后将他们的哈希与我的进行比较,从而知道我的密码是什么吗?

嗯,并非如此。原因如下。

使你的哈希值加盐

首先,你需要在哈希值中使用两部分数据,这样你就可以创建非常随机的哈希值。

为了增加获取我们原始值的难度(或理论上不可能),我们需要在初始输入中添加第二个值。这个第二个值称为盐 (salt)。

盐:额外的单词或短语

例如,我们可以创建一个额外的单词或短语,并将其附加到我们要哈希的每个输入后面。

这是所有之前的词,在为每个词添加相同的盐后,其关联的哈希值。

看看这些哈希值现在有多么不同?它们一点也猜不出来。如果能猜出来,那么 SHA256 哈希算法早就被破解了。

保持盐值秘密

但是,你必须保守这个盐的秘密。如果它泄露了,那么破解者就可以生成字典中的所有单词,对它们进行哈希处理,然后通过暴力破解将它们与 100 亿密码库中存储的 SHA256 哈希值进行逐一比较。

你真正需要的是一个程序来为你做这件事

我碰巧写了这样一个程序,它是 FOSS(完全开源软件),而且永远免费。

这意味着:

  1. 你可以免费试用
  2. 你可以免费使用
  3. 你可以随意查看和修改该软件……免费。

免费试用

如果你愿意,你现在就可以在浏览器中试用。

只需访问 C'YaPass : Never type a password again[^],你就会看到类似以下的内容。

SiteKeys:自行添加

当然,你还没有任何 siteKeys,但你可以添加它们。

生成密码有两个部分。

  1. SiteKey - 你自己创建的用于记住该密码将用于哪个网站的唯一字符串。
  2. 你绘制的生成值的图案——这是使 SHA256 哈希随机化的盐。

最后,屏幕右下角的值是你可以在网站上使用的 64 个字符的密码(SHA256 哈希)。

你的密码不会被存储在任何地方,它们每次都会被生成。

这是尖端技术,因为你的密码永远不会被存储在任何地方。

要生成你的密码,你必须:

  1. 选择你的 SiteKey。
  2. 绘制你的图案。

你只需要一种图案。

因为图案就是盐,所以每次你更改 sitekey(在左侧选择一个不同的)时,你都会为相关的网站获得一个新密码。所以你不需要为每个 sitekey 更改图案。

你的密码将不是基于自然语言词汇

这意味着你的密码将是随机的数字和字符。它们不会出现在破解者的彩虹表中作为目标匹配项。

网站将哈希你的哈希

当你使用这些哈希作为密码时,你登录的网站将再次对它们进行哈希处理并存储在它们的网站上,这也很意思。

但是,我增加了一个保护层。

多重哈希:多次哈希你的哈希

看看更新后的 C'YaPass,你会发现我已经添加了功能,可以让你将初始值哈希 X 次(你可以选择)。(见红色高亮部分)。如果你更改该值,那么你所有的哈希都将被哈希 X 次(示例中为 10 次)。

结论

  1. 如果你想要真正强大的密码,你永远不会在密码中使用自然语言词汇。永远!
  2. 密码问题似乎被不恰当地报道以吸引眼球并出于某种原因吓唬人们。密码是没问题的,你自己拥有它们。但是,它们永远不应该包含自然语言词汇。永远!
  3. 报道的 100 亿密码泄露显然是报道不当的。那些不是明文密码,而是(最有可能)密码的哈希值,如果它们包含自然语言词汇,破解者可能能够利用它们,在暴力破解其算法生成 SHA256 哈希匹配后。这就是当今真正的密码破解技术:哈希匹配。

哈希匹配

既然哈希匹配是破解者破解密码的真正方式,那么这意味着你更好地理解了破解者在做什么。因为你更好地理解了它,所以你就明白了你永远不希望你的密码包含自然语言词汇。

为了保护自己,请使用密码生成器,它会生成随机密码。

如果你喜欢这篇文章,请查看我的 C'YaPass 的 GitHub 源代码。

  1. 基于 Web 的解决方案 - (也在 https://cyapass.com/js/cya.htm 上可见)
  2. ElectronJS(跨平台解决方案)- 适用于 macOS、Windows、Linux。

而且,不要相信你读到的关于密码的一切。 🤓

历史

文章首次发布于 2024-07-09

© . All rights reserved.