我正在评估信用卡处理器[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 哈希的“摘要”,在这种情况下,是由以下字符串连接组成的“消息”:
- 我的秘钥,
- 我的商家ID,
- 交易金额,以及
- 交易类型
因此,在这种情况下,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] 此处未命名。给我发电子邮件了解详情。