使用 MD5 是否足以拒绝此付款处理器?

信息安全 Web应用程序 哈希 md5
2021-08-15 18:33:58

我正在评估信用卡处理器[1],我注意到他们正在使用 MD5 作为加盐哈希算法的一部分来保护密钥。因为我知道 MD5 通常被认为是损坏的,所以这感觉像是一个糟糕的解决方案。这足以作为我们的处理器拒绝它们的标准吗?是否可以演示攻击?

(如果这应该在不同的 StackExchange 站点上,请告诉我。)

这是具体的场景,简化为重点。

证书

首先,我有一个包含 30 多个大写字母数字字符和符号的“密钥”。(比如说,TUQ1ICGIIIK/PSBKNDFK=GNKOTHMMDBI。)我还有一个 12 位数字的“商家 ID”。(说,123456789012。)

可公开访问的付款表格

其次,简化的付款表格看起来像这样。(真正的形式将包括其他参数,如姓名和地址。)

<form action="https://examplepaymentprocessor.com" method="POST">
    <input name="MERCHANT" value="123456789012" />
    <input name="TAMPER_PROOF_SEAL" value="d550a25dfb97697f5be928953ee7cfc4" />
    <input name="TPS_DEF" value="MERCHANT AMOUNT TRANSACTION_TYPE" />
    <input name="AMOUNT" value="10.00" />
    <input name="TRANSACTION_TYPE" value="SALE" />
    <!-- other input fields for credit card number, contact information, etc. -->
    <input type="submit" value="Make Purchase" />
</form>

“防篡改密封”是 MD5 哈希的“摘要”,在这种情况下,是由以下字符串连接组成的“消息”:

  1. 我的秘钥,
  2. 我的商家ID,
  3. 交易金额,以及
  4. 交易类型

因此,在这种情况下,MD5("TUQ1ICGIIIK/PSBKNDFK=GNKOTHMMDBI12345678901210.00SALE") = d550a25dfb97697f5be928953ee7cfc4

TPS_DEF允许用户指定消息的具体内容——或者,如果您愿意,可以指定密钥加盐。消息至少包括密钥,但最多可以包括表单上的所有其他参数。我的示例包括商家 ID、金额和交易类型。

数据检索

检索示例事务的过程类似。通过(不可公开访问的)HTML 表单或其他一些 HTTP 方法POST,我可以获得有关给定交易的信息。(假设我有一个从上述过程中获得的交易 ID。)

<form action="https://examplepaymentprocessor.com/transaction_status" method="POST">
    <input name="MERCHANT" value="123456789012" />
    <input name="TAMPER_PROOF_SEAL" value="d550a25dfb97697f5be928953ee7cfc4" />
    <input name="TPS_DEF" value="MERCHANT" />
    <input name="TRANSACTION_ID" value="1234567890" />
    <input type="submit" value="Get Info" />
</form>

这将返回信息,包括客户的所有联系方式及其信用卡号的最后四位数字。请注意,同样,您(或攻击者)可以TPS_DEF根据需要指定。

想象攻击

鉴于 MD5 容易受到选择前缀攻击,我使用Mark Stevens的HashClash,但这似乎创建了两条具有特定前缀的新消息,而不是创建第二条 MD5 与第一条匹配的消息。不过,似乎拥有自己的密钥的人可能会创建交易状态请求,该请求将以这样一种方式进行散列,即它会检索我的数据而不是他们的数据。

问题

  • 攻击者伪造“防篡改印章”以模仿我的可能性有多大?无论是伪造交易还是获取客户和交易信息——我认为后者最有可能。)
  • 还有其他您可以想象或演示的攻击吗?
  • 你会拒绝这个处理器吗?(请注意,它们在其他方面与我们完美匹配。)

编辑1:阅读this other question让我认为,由于MD5仍然可以抵抗原像攻击,这种特殊情况是安全的。

编辑 2:我澄清了关于伪造交易被盗客户信息的攻击的问题。

[1] 此处未命名。给我发电子邮件了解详情。

3个回答

这个“防篡改封条”是自制的 MAC,不是好的。

MD5 被“损坏”在这里没有任何意义。MD5 因碰撞而损坏,碰撞对您的情况没有任何影响。可能令人担心的是长度扩展攻击这是因为 MD5 是Merkle-Damgård函数。这意味着当 MD5 处理消息m时,它会执行以下操作:

  • 消息m填充有长度在 65 和 576 位(含)之间的位序列p,因此m||p的总长度是 512 的倍数。p取决于m的长度但不取决于m的内容
  • 填充字符串m||p被分成 512 位块。
  • MD5 使用 128 位状态按适当顺序处理每个块,该状态是前一个块处理的结果。哈希输出是最后一个块的处理的输出。

现在想象一下,攻击者可以看到你的一个“防篡改封条”。印章是攻击者不知道的某个m的散列(它以您的密钥开头)。但是,攻击者可能会很好地猜测m长度因此,攻击者可以计算p现在,攻击者任意选择一个字符串m'“长度扩展攻击”是他可以在不知道m的情况下计算 MD5( m||p||m' ) ,因为他知道 MD5 在处理m||p时的状态:这正是你的“防篡改密封” “ 价值。在由。

在您的情况下,可以节省您的是以下两点:

  1. 即使攻击者可以任意选择m',他也只能追加,中间有填充p他的目标是为语法上有效的交易计算哈希值。根据“金额”和“交易类型”的实际编码,攻击者可能会或可能不会设计一些m'使得m||p||m'在服务器端仍然有意义。

  2. 攻击者必须首先观察一个“印章”值。由于它们是使用 HTTPS 传输的,因此这对他来说可能很困难。

重要提示:长度扩展攻击与 SHA-256的工作方式完全相同(以p中的一些字节序细节为模)。这并没有利用 MD5 的特定弱点。

计算 MAC的正确方法是HMACHMAC 使用像 MD5 或 SHA-256 这样的底层散列函数,但它“聪明地”这样做,有两个嵌套调用,正是为了避免诸如长度扩展攻击之类的问题。


至于你的确切问题:不,我不认为这是拒绝与这些人做生意的理由。毕竟,MAC 不是“证明”,尽管它的名字。这是对称密码学:要验证印章,服务器也必须知道您的秘密值。相应地,服务器拥有制造“假”印章值的技术力量。如果您与信用卡处理商本身发生争议,您可以指出:在诉讼过程中,印章不能作为对您不利的证据。

这个印章是他们对你进行身份验证所需要的,所以基本上是他们的责任。我建议你把他们自己的问题留给他们自己处理。不过,您可能希望将此问题作为礼貌的警告提出。类似于:“你知道,为了获得良好的印章,你最好使用标准的、NIST 批准的解决方案,如 HMAC/SHA-256,而不是使用 MD5(声誉可疑)的非标准本土机制”。MD5 的已知弱点(与 SHA_256 相比)在这种特定情况下对安全性没有实际影响,但“MD5”这个名称及其负面报道仍然可以作为外交手段有效。

如果他们将它用作连接签名(实际上,就是这样 - 它保证参数没有被篡改),并且看到参数的顺序,我敢说 MD5,虽然不是地球上的最佳选择,并不像听起来那么糟糕。

在以下情况下生成选择前缀冲突是微不足道的(2^{50} 的顺序):

  • 你知道hash(p1 // m1) ( True )
  • 你知道p1False。你的前缀是你的私钥,应该是私有的)
  • 你选择第二个前缀p2

因此,选择前缀攻击不一定适用。不仅如此,为了有效地伪造交易,您会希望更改散列的一部分,保持所有其他部分不变(如果要伪造某些东西,您不想要不同的公钥或私钥,你只会改变金额)。

因此,实际上,它并不是最好的(HMAC-SHA256 通常用于此目的),但它确实有效并且相对安全(对于给定的 relative 值)。如果伪造交易不是您的错,我个人会根据通过的金额和支付提供商的保险支付来拒绝/接受。

如果他们使用 SHA-256 会更好。但是,该设计看起来像蛮力伪造攻击在计算上会非常昂贵。我认为攻击者更有可能试图通过恶意软件、MITM 或社会工程绕过它。老实说,他们很少尝试直接突破加密,除非它是一个做得不好的密码哈希。如果商业协议的其他方面看起来不错,支付处理器可能仍然值得。