100亿密码泄露?你真的了解密码破解吗?真的吗?
让我们看看密码破解到底意味着什么,以及如何让你的密码更安全——可能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)这样的弱密码,他们没有向读者解释的是,有数百万的账户是由一次性用户创建的,还有一些是由黑客创建的,这些用户根本不在乎密码。
是的,普通人也会创建弱密码
是的,我知道,普通人会创建糟糕的密码。但是,他们可以做一件简单的事情来使他们的密码安全:永远不要在密码中使用自然语言词汇。
解决方案
相反,创建一个完全随机的字符集作为你的密码。
问题
普通用户将无法记住随机字符集。
显然,可以通过强制用户使用密码管理器来生成随机密码来解决这个问题。
奇特的解决方案:仓鼠法
这里有一个方法可以使普通用户的账户几乎完全安全。请评论并参与讨论,论证为什么这可能不正确。
以下是步骤:
让仓鼠在键盘上跑动,为用户的电子邮件主账户创建一个随机密码。
- 我刚把我的仓鼠丢在键盘上,得到了: adgy788t6ops;ldfkyudt621@DCG32#@&
- 用这个作为她电子邮件账户的主密码。这样她的主电子邮件账户就可以用一个随机的强密码来保护。
- 把这个写下来,放在一个密封的保险箱里——总有一天用户会记住它。
- 之后,用户每次创建新账户时,都应该再次把仓鼠丢在键盘上生成密码,但是这些账户不需要写在任何地方?什么?
- 每次用户登录任何其他账户时,她都会简单地说,“哦,我不知道我的密码,请重置账户”,然后发送到她的主电子邮件账户。
- 她将从主电子邮件账户中检索重置信息并登录。
- 现在只有一个主密码需要记住/使用,而其他所有密码每次都会被重置。
- 这难道不是很天才吗?!
我的观点是:如果没人知道你的密码(包括你自己),那么它就是安全的
我的真正观点是:随机!
我的真正观点是,密码必须是随机的,这样才无法被猜测。
但是,为了更好地陈述这一点,我想说:
密码不得包含任何可被检测为模式的模式。
这才是真正的随机。
破解者如何破解密码
人们似乎忘记了破解者是如何实际破解密码的。
忽略明文存储
让我们忽略那些以明文形式存储你密码的公司,好吗?它们还存在吗?我希望没有。如果存在,那你可就惨了。这是无法避免的。破解者会破解,然后他们会得到一个明文密码的宝库。
生成所有哈希值并进行比较
破解者获取密码的真正方式是:
- 编写一个算法,该算法**对可疑密码和密码短语进行哈希处理**,生成一个巨大的哈希数据库。
- 将这些哈希值与他们在从公司窃取的文件中找到的哈希值进行比较。
就是这样!
考虑 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。
从袋子里拿出一个随机物品
想想这个实验。
- (不看)从一个装有 HUGE-NUMBER 个物品的袋子里随机拿出一个物品。
- 将物品放回袋子,与其余 HUGE-NUMBER 个物品混在一起。
- 第二次(不看)伸手,尝试随机再次拿出同一个物品。理论上是不可能的!
这为什么很重要?
这很重要,因为任何唯一的输入都会产生一个新的、唯一的输出。目前,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()
- 首先,我们在命令行中读取用户提供的字符串值 (
$target
)。 - 接下来,我们设置一个 StringStream 并将值设置为用户提供的字符串 (
$target
)。 - 接下来,我们调用 Get-FileHash(生成 SHA256)并将用户提供的字符串传递给它。
- 最后,我们为了保持一致性而将哈希值转换为小写。
这里有一些我为你哈希过的词。我在我的 Ubuntu 22.04.4 系统上运行了它。
长度为 64 个字符
哈希值长度为 64 个字符,因为 32 个字节(256 位 / 8 位 = 字符数 = 32)中的每一个都由一个 2 字符的十六进制值表示。
获取源代码(在文章顶部),你也可以尝试一下。
这里有一个随机词列表及其 SHA256 哈希值。
我自己的建议
我的建议是,不要自己编造密码,而是生成一个 SHA256 哈希值并将其用作你的密码。
破解者也能生成相同的哈希值吗?
但是,等等,难道别人不能使用我用来生成 SHA256 哈希值的相同单词,然后将他们的哈希与我的进行比较,从而知道我的密码是什么吗?
嗯,并非如此。原因如下。
使你的哈希值加盐
首先,你需要在哈希值中使用两部分数据,这样你就可以创建非常随机的哈希值。
为了增加获取我们原始值的难度(或理论上不可能),我们需要在初始输入中添加第二个值。这个第二个值称为盐 (salt)。
盐:额外的单词或短语
例如,我们可以创建一个额外的单词或短语,并将其附加到我们要哈希的每个输入后面。
这是所有之前的词,在为每个词添加相同的盐后,其关联的哈希值。
看看这些哈希值现在有多么不同?它们一点也猜不出来。如果能猜出来,那么 SHA256 哈希算法早就被破解了。
保持盐值秘密
但是,你必须保守这个盐的秘密。如果它泄露了,那么破解者就可以生成字典中的所有单词,对它们进行哈希处理,然后通过暴力破解将它们与 100 亿密码库中存储的 SHA256 哈希值进行逐一比较。
你真正需要的是一个程序来为你做这件事
我碰巧写了这样一个程序,它是 FOSS(完全开源软件),而且永远免费。
这意味着:
- 你可以免费试用
- 你可以免费使用
- 你可以随意查看和修改该软件……免费。
免费试用
如果你愿意,你现在就可以在浏览器中试用。
只需访问 C'YaPass : Never type a password again[^],你就会看到类似以下的内容。
SiteKeys:自行添加
当然,你还没有任何 siteKeys,但你可以添加它们。
生成密码有两个部分。
- SiteKey - 你自己创建的用于记住该密码将用于哪个网站的唯一字符串。
- 你绘制的生成值的图案——这是使 SHA256 哈希随机化的盐。
最后,屏幕右下角的值是你可以在网站上使用的 64 个字符的密码(SHA256 哈希)。
你的密码不会被存储在任何地方,它们每次都会被生成。
这是尖端技术,因为你的密码永远不会被存储在任何地方。
要生成你的密码,你必须:
- 选择你的 SiteKey。
- 绘制你的图案。
你只需要一种图案。
因为图案就是盐,所以每次你更改 sitekey(在左侧选择一个不同的)时,你都会为相关的网站获得一个新密码。所以你不需要为每个 sitekey 更改图案。
你的密码将不是基于自然语言词汇
这意味着你的密码将是随机的数字和字符。它们不会出现在破解者的彩虹表中作为目标匹配项。
网站将哈希你的哈希
当你使用这些哈希作为密码时,你登录的网站将再次对它们进行哈希处理并存储在它们的网站上,这也很意思。
但是,我增加了一个保护层。
多重哈希:多次哈希你的哈希
看看更新后的 C'YaPass,你会发现我已经添加了功能,可以让你将初始值哈希 X 次(你可以选择)。(见红色高亮部分)。如果你更改该值,那么你所有的哈希都将被哈希 X 次(示例中为 10 次)。
结论
- 如果你想要真正强大的密码,你永远不会在密码中使用自然语言词汇。永远!
- 密码问题似乎被不恰当地报道以吸引眼球并出于某种原因吓唬人们。密码是没问题的,你自己拥有它们。但是,它们永远不应该包含自然语言词汇。永远!
- 报道的 100 亿密码泄露显然是报道不当的。那些不是明文密码,而是(最有可能)密码的哈希值,如果它们包含自然语言词汇,破解者可能能够利用它们,在暴力破解其算法生成 SHA256 哈希匹配后。这就是当今真正的密码破解技术:哈希匹配。
哈希匹配
既然哈希匹配是破解者破解密码的真正方式,那么这意味着你更好地理解了破解者在做什么。因为你更好地理解了它,所以你就明白了你永远不希望你的密码包含自然语言词汇。
为了保护自己,请使用密码生成器,它会生成随机密码。
如果你喜欢这篇文章,请查看我的 C'YaPass 的 GitHub 源代码。
- 基于 Web 的解决方案 - (也在 https://cyapass.com/js/cya.htm 上可见)
- ElectronJS(跨平台解决方案)- 适用于 macOS、Windows、Linux。
而且,不要相信你读到的关于密码的一切。 🤓
历史
文章首次发布于 2024-07-09