一个函数是:
$a == md5($b . $secret);
- 您可以选择 $a 和 $b
- 你不知道 $secret
- 您将获得 $a 和 $b 的函数值,您选择 true 或 false。
一般来说,有没有比蛮力更好的攻击来找到 $secret?使用PHP 的 md5 函数找到 $secret 是否有比蛮力更好的攻击?
从我在网上找到的内容来看,我认为没有,尽管 md5 在其他一些用例中已被弃用。所以只是为了确定......
亲切的问候
一个函数是:
$a == md5($b . $secret);
一般来说,有没有比蛮力更好的攻击来找到 $secret?使用PHP 的 md5 函数找到 $secret 是否有比蛮力更好的攻击?
从我在网上找到的内容来看,我认为没有,尽管 md5 在其他一些用例中已被弃用。所以只是为了确定......
亲切的问候
如果 MD5 表现得像一个随机预言机(这是一个很大的“如果”,见下文),那么穷举搜索$secret
是最好的攻击方式——更重要的是,每个“猜测”的值都$secret
必须使用对函数的查询(由于您使用 PHP,我假设该功能是在 Web 服务器中实现的,并且每个“查询”都需要与该服务器对话)。True
后者是由于缺少发送回攻击者的信息所暗示的:攻击者除了一个位(“ ”或“ False
”结果)之外什么也得不到。特别是,他没有得到 MD5 输出本身。攻击者将得到一长串无信息的“ False
”结果,除非他命中正确的 MD5 输出,或者纯粹是出于偶然(概率 2 -128,这是真的该死的小),或者因为他正确地猜到了$secret
事先的价值。值得注意的是,这可以防止攻击者使用许多成本分摊技术,包括预计算表,尤其是过度宣传的彩虹表。
随机预言机是一个神话对象,可以看作是一个确定性的黑匣子:您对从给定输入获得的输出一无所知,除了对于给定输入,盒子总是返回相同的结果。一个模型如下:盒子里有一个侏儒、一些骰子和一本大书。gnome 使用骰子随机选择输出。他还使用这本书来跟踪他已经发送的答案,以保持一致,即如果输入与先前提交的输入相同,则 gnome 将返回与以前相同的输出而不是掷骰子。
然而,MD5不是随机预言机。例如,对于具有 128 位输出的函数,我们可以比理论上的 2 64电阻更快地为 MD5 构建碰撞。另外,请注意,作为一个好的散列函数(防碰撞等)并不绝对需要“随机预言”。例如,SHA-256被认为是一种安全的散列函数,但它仍然遭受所谓的“长度扩展攻击”(给定SHA256($a)
,人们可以SHA256($a . $b)
在不知道的情况下计算$a
,对于 的几乎任意值$b
)。因此,随机预言机的保证不适用于 MD5(或者,就此而言,SHA-256)。这并不意味着更快的攻击是已知的!只有你自己在这里。
还可以指出,这md5($b . $secret)
是一种“keyed hash”,即MAC(Message Authentication Code)。从散列函数构建 MAC 并不容易,正是因为长度扩展攻击之类的事情(md5($secret . $b)
例如,将是一个非常糟糕的 MAC)。设计了一种从散列函数构建 MAC 的稳健方法;它被称为HMAC并涉及对底层哈希函数的两次调用(但其中一个是在短输入上的,因此这仍然是有效的)。HMAC 的安全性,更准确地说,HMAC 如何被视为随机预言机,可以“证明”,即简化为某些散列函数内部属性,这些属性在 SHA-256 的情况下被认为是正确的(参见NMAC 和 HMAC 的新证明: Mihir Bellare 的无碰撞安全性的血腥细节)。通过使用 HMAC/SHA-256 over作为密钥$b
,$secret
您将从这些安全结果中受益,并且您的结构将更加健壮。再说一次,我并没有声称存在已知的攻击md5($b . $secret)
,只是使用 MD5和自制 MAC 结构都会引发危险信号,这会降低可以赋予此类系统的信任级别。
$a
这是一个有趣的问题,因为在 IT 安全的典型场景中,您无法选择$b
作为攻击者。例如,如果您能够获得散列密码,$a
并且$b
已经定义并且您必须使用它。$b
在这种情况下,如果有盐可用,您只能使用蛮力或彩虹表。
另一方面,在您的示例中,您可以自由选择这两个值。您可以采用任意秘密,例如,并相应test
地选择 和 的值。我选择 $b 作为 an并用计算,结果为.$a
$b
empty string
$a
$a = md5($secret)
098f6bcd4621d373cade4e832627b4f6
我选择$a = "098f6bcd4621d373cade4e832627b4f6"
并$b= ""
问你是否$secret == "test"
。你说真的,我说问题解决了。
这最终将我们引向了真正的答案。给出的两个条件
不要一起工作。在我的例子中,我定义了$secret
自己。我违反了第二个条件。另一方面,如果不从 导出它们,我就不能随意选择$a
和任意选择,因为它们可能没有解决方案。$b
$secret
$a
如果我们假设所有可能的和对至少有一个解决方案$b
(也许有证据,我不知道),并且您以一种您真的不知道的方式选择它们$secret
,我总是想定义$b = ""
,使攻击尽可能简单。在这种情况下,彩虹桌是您的朋友。
下载著名密码的彩虹表/密码哈希!:)