你的密码是如何被破解的?如何提高密码安全性?
在本文中,我们介绍了几种破解密码的经典方法,以及这些方法背后的基本原理。针对这些概念,我们提供了从密码保管人和账户拥有者两个角度来增强密码安全性的实践。
我们经常看到新闻报道一些用户数量庞大的知名应用的用户密码泄露。你可能觉得因为你自己没有使用那些特定的应用,这样的事件和你没有关系,但实际上并非如此。
最近,Twitter上也有新闻称AI方法可以大大加快破解密码的速度。所以我们想了解其中的复杂性,以及看看我们如何提高密码的安全性。
密码是如何被破解的?
一般来说,账户密码通常使用各种哈希算法处理后存储在数据库中。你可以参考我们之前的博客以更好地了解密码哈希。遗憾的是,一些缺乏常识的服务提供商在其数据库中以明文形式存储密码。如果数据泄露,这种做法可能造成更大的损害。
通过存储哈希密码,即使数据库管理员也无法访问你的原始密码,从而显著提高安全性。验证输入密码的正确性时,使用相同的哈希算法处理输入的密码,然后将生成的哈希与数据库中存储的值进行比较。如果两个哈希值匹配,则认为输入的密码是正确的。
简单来说,密码破解涉及生成符合允许密码规则的字符串。然后涉及使用上述方法反复检查这些字符串,以最终找到正确的明文密码。
常见的密码破解方法
在本节中,我们将简要介绍三种常见的密码破解方法。
暴力攻击
暴力攻击通常枚举所有在允许的密码规则内的可能性,并一个接一个地尝试。
例如,手机可以设置一个4位数的数字密码。暴力攻击会从 0000
、0001
、0002
,一路尝试到 9999
。
暴力攻击非常耗时,因为尝试次数太多。假设密码长度为 $L$,密码每位可能的字符数量为 $n$,则需要尝试的可能性数量为 $n^L$,这是一个非常大的数。
许多密码要求数字、大写和小写字母以及特殊字符的组合,原因在于增加 $n$,从而大大增加可能性数量,增强破解密码的难度。
字典攻击
字典攻击利用字典中的单词,通常结合空格、数字、特殊符号和其他元素,形成多种密码组合。然后使用这些组合来尝试匹配密码。
许多人为了方便记忆,倾向于使用有明确含义的句子作为密码。字典攻击是破解具有这种特性的密码的有效方法。
彩虹表攻击
彩虹表是一种将明文密码预先计算并映射到其对应的哈希值的表。通过直接将数据库中存储的哈希值与彩虹表中的哈希值进行比较,找到匹配项后,可以查找并直接获取相应的明文密码。
如果哈希值已经被预先计算(并记录在彩虹表中),彩虹表提供立即获取明文密码的优势。但需要注意的是,如果哈希值没有被预先计算(因此不在表中),则无法使用彩虹表。
除了上面描述的方法之外,还有很多其他没有包含在这里的技术。通常,结合使用这些方法能涵盖所有可能的密码,并加快破解过程。
如何加快密码破解?
在上一节中,我们简要介绍了一些经典的密码破解方法。从中我们可以总结出一些提升密码破解速度或成功率的想法。
破解密码通常涉及两个步骤:
- 确定密码的搜索空间(生成可能的密码)
- 使用哈希算法生成上一步骤中获得的可能密码的哈希,并将其与要破解的密码的哈希进行比较
上述提到的字典攻击和彩虹表攻击分别优化了这两个步骤:
- 字典攻击缩小了密码的搜索空间。基于“用户习惯用实际含义的单词组合来创建密码”这一假设,诸如
zzzz
这样的词不包括在字典中,这意味着不会尝试它们作为潜在密码。这种做法类似于提前排除错误答案。类似于做选择题,虽然你可能不知道正确选项,但可以识别哪些选项肯定是错的。通过排除这些明显错误的选项,你在剩余选项中猜对的机会会增加。 - 彩虹表攻击加快了哈希算法的执行时间。对于精通数据结构的人来说,查找是一个 $O(1)$ 复杂度的操作,时间复杂度上没有比 $O(1)$ 更简单的操作了。相比之下,常用的哈希算法如MD5和SHA的时间复杂度为 $O(n)$,这比 $O(1)$ 慢得多。
在实际操作中,优化密码破解过程也主要从以上两个角度入手。值得一提的是,由于字符串哈希算法的 $O(n)$ 时间复杂度的优化空间相对较小,更多考虑的是在硬件或计算方法方面的改进,这里不再详细阐述。
那么AI如何帮助破解密码?
在整个密码破解的尝试中,AI的角色是从被暴露的明文密码中学习某些模式和构造方法。随后 ,AI可以模拟这些密码构造模式生成一堆潜在的密码。接下来,AI可以使用哈希算法或甚至专门的硬件来执行密码破解。
事实上,比起其他密码破解工具,PassGAN 的杀手级优势在于它可以“最快猜测出最可能的密码”,这就是我们上面提到的“缩小可能密码搜索空间”的思路。
如何使密码更安全?
我们将从两个角度解释如何保护密码。在这里我们简单地从密码本身入手,而不讨论其他确保账户安全的手段,如多因素认证(MFA)等。
从身份服务提供商的角度
作为身份服务提供商,他们托管所有用户的密码,这赋予了他们保护这些密码安全的责任。以下是一些增强用户密码安全性的方案:
-
避免以明文存储密码: 尽管这可能听起来像常识,但一些服务提供商仍然在其数据库中以明文形式存储密码。使用哈希值来存储密码增加了安全层;即便数据库被入侵,黑客也需要付出相当大的努力才能破解哈希密码。
-
对用于密码验证的 API 接口应用速率限制: 让我们回顾一下前面提到的密码破解过程。该过程中一个不可或缺的部分涉及“验证”某个密码是否正确。由于密码由身份服务提供商保管,他们是唯一有能力提供用于密码验证的 API 的实体。通过限制访问此 API 的频率,我们可以阻止黑客快速地尝试各种密码,即使他们拥有非常可能的密码猜测。
-
实施更复杂的密码组合: 例如,正如前述所提,给定长度内的密码字符多样性越大,复杂性越高。此外,可以使用类似于先前讨论的 AI 技术,在提交前评估密码安全性。如果某个密码被认为较弱,可以提示用户选择更强的选项。
从用户的角度
作为账户和相关数字资产的拥有者,用户需要非常注意确保他们账户密码的安全。
-
避免在不同网站上使用同一密码: 在获得某些网站的密码后,许多黑客试图利用这些账户凭据访问其他网站。如果不同服务的多个账户共享同一密码,则在上述场景中可能面临失去账户和信息泄漏的风险。
-
尽可能选择纯随机密码: 这种方法有助于防止重用大多数人使用的常见密码模式(如前所述,使用英文句子),从而使黑客难以“缩小密码搜索空间”并提高密码复杂性。
作为身份服务的基础设施提供商,Logto 实施了许多上述最佳实践来保护用户账户的安全性。这使得用户可以安心使用各种应用,而无须担心账户丢失,同时也让在线服务提供商以最小的努力确保用户数据安全,从而专注于他们的核心业务活动。