使用已知密码破解散列密码

信息安全 哈希 密码破解
2021-08-18 21:54:23

我是一名开发人员,试图部署我在工作中编写的新仪表板,旧仪表板是一堆乱七八糟的库,只有大约一半的代码库仍在使用中(到处都是死代码,从未被删除,但什么都不做)...

我不想再为这种胡说八道而自杀,我试图从用户(很少)从默认密码更改密码的帐户中获取用户注释。我有默认密码的存储散列字符串、它转换为的密码、使用的散列机制、使用的加密方法以及其他密码的散列字符串。

需要一种简单的方法来使用此信息来解密其他密码吗

如果这是不可能的,有人可以向我解释为什么吗?我得到了散列的单向性质,但是考虑到我有多少关于端到端过程的信息,我基本上知道整个过程,所以我不确定在这种情况下是否重要......

总结一下:

我可以使用散列和加密机制的知识以及示例散列字符串及其明文值来破解由相同代码生成的其他密码吗?

PS:如果有帮助,每个默认哈希都是相同的,无论它是什么时候制作的......

4个回答

简短的回答:

您无法解密哈希。您将不得不使用其他方法来恢复它。

解释:

散列的结果不是密码的加密版本。它不能被解密,就像你不能吃薯饼并重建一个完整的土豆一样。加密哈希的结果是数据的加扰版本,其中大部分原始数据丢失。您可以猜测丢失的数据可能是什么,但您可能错了,并且对于加密哈希函数,任何一点的错误都会使计算出的数据与原始数据大不相同。

但是,假设您可以访问旧系统的源代码,您可以使用不同的方式恢复该默认密码。以下是三种可能性:

  1. 由于是默认密码,而且这个密码对每个人都是一样的,所以最初的开发者并没有过多考虑密码的安全性。检查围绕用户创建的源代码;密码可以以明文形式存储。

  2. 默认密码必须以某种方式传达给新用户。创建一个新帐户,询问您的 IT 管理员,或询问将密码提供给新员工的 HR 代表。

  3. (有点阴暗)您也可以将密码从旧系统批发复制到新系统,当用户使用默认密码登录时,您将在短时间内以纯文本形式获得它,同时身份验证系统会验证密码与存储的哈希匹配。以此为契机,将每个人的密码转换为密钥扩展算法,例如 PBKDF2、bcrypt、scrypt 或 Argon2id。

而且,如果所有这些都失败了,让用户打电话,解释情况,并安排他们可以看到你工作的时间,然后立即重置他们的密码。(我只是把它作为最后一个选项,因为评论中提到这是你想要避免的情况。)

在所有情况下,您都应该立即使密码过期(因为您刚刚破坏了它)。但是,使用默认密码暗示应用程序可能没有密码过期功能,因此这可能是一个有争议的问题。

当您研究身份验证系统时,请前往NIST 数字身份指南,浏览整个内容,并特别注意 SP 800-63B。

我将在这里用一个简单的例子来补充大量的答案,因为我发现将事情简化为基础通常可以提供非常丰富的信息。关键是散列算法会破坏数据。一个 Argon2 散列总是有 32 个字节,即使你将它全部提供给 Wikipedia。实现这一目标的唯一方法是丢弃大量数据,一旦丢弃,它就消失了。

为了证明我有一个简单(而且很糟糕)的散列算法。它检查其输入是否有任何大写字母。如果它找到任何大写字母,它就会输出True如果不是,则输出False. 以下是一些示例输入和输出:

123456 -> False
asdfer -> False
rfjeif -> False
27_+$( -> False
weAdfy -> True
ErYHV1 -> True
12345W -> True
WERERE -> True

现在我有一个用户的哈希,它是:True. 密码是什么?

您的问题有点令人困惑,因此如果以下内容不完全适合您的情况,请更正以下假设:

  • 您的系统为多个用户存储加密数据。
  • 每个用户的数据都使用唯一的每用户密钥进行加密,或者使用使用每用户密钥加密(包装)的主密钥进行加密。
  • 每个用户的密钥要么使用从用户密码派生的密钥进行加密(包装),要么直接派生自用户密码。
  • 您知道某些用户的密码,但不知道其他用户的密码。
  • 您知道用于身份验证的密码哈希算法。
  • 您可以访问身份验证哈希。
  • 身份验证散列未加盐(“每个默认散列都是相同的”)。
  • 您要么知道,要么可以访问用于从密码派生密钥的算法。
  • 您想为不知道密码的用户解密数据。

如果不了解系统的更多信息(例如使用的密码、使用的散列/密钥派生算法等),我不一定能找到系统中最薄弱的地方进行攻击。但是,如上所述,弱链接听起来像是密码哈希。如果它们对于给定的密码实际上是相同的,则表明它们没有加盐,这意味着密码散列方案非常弱(可能像单轮 MD5 一样糟糕)。对于未加盐的哈希,您可能可以使用彩虹表(将预先计算的哈希摘要映射到其输入值的查找表)。然而,即使你不能(例如,你想要的密码不在你能找到的表中),暴力破解这样的哈希通常也很容易;现代消费级 GPU 每秒可以执行数十亿次这样的哈希,


为了更直接地解决这个问题:所有现代加密和散列标准都假设它必须是安全的,即使攻击者确切知道算法的步骤是什么。了解算法——它严格控制了了解哈希算法的某些(输入、摘要)对的价值,因为你可以自己计算摘要,只要你有输入和算法——是所有现代加密都需要的基线假设防患于未然。如果几百万个输入/输出对足以破坏密码或散列算法,那么加密货币就不值钱了。

不,已知密码信息对破解未知密码没有帮助。

哈希是单向陷门函数的结果。散列与加密的不同之处在于加密可以反转,而散列不能。散列会破坏信息,并且无法从安全散列中重建原始密码。如果原始密码稍有变化,得到的哈希值就会完全不同。因此,您甚至无法比较两个哈希来查看原始密码是否相似。

许多开源项目公开了他们的应用程序密码是如何被散列的。这不会降低哈希的安全性。还有一些数据库由已知的密码哈希组合组成。这些无助于破解数据库未知的密码。

您只能使用传统的密码破解方法,这通常涉及以自动方式尝试可能的密码,以查看它们是否与哈希匹配。这绝不比 58 个电话更容易或更快。