并非每天都能将第二次世界大战密码分析的经验应用到自己的网络应用程序中。但今天,我们正是要这样做。事实上,我们将看看即使是最强大的现代密码工具之一,如果实施者在信息传输中犯了图灵发现的同样错误,也会被阿兰-图灵用来破解英格玛机的方法所击败,而英格玛机是当时最强大的密码工具。
让我们来看看我最近评估过的一个应用程序接口,看看它是如何避免在第二次世界大战中帮助盟军击败轴心国的问题的。
电子商务应用程序接口:一罐甜蜜的蜂蜜
今天我要介绍的例子是一家电子商务公司用于接受付款的 API。就攻击目标而言,对于恶意行为者来说,没有比信用卡支付 API 更有价值的了。因此,这家公司决定向全世界公开一个公钥,API 消费者可以通过该公钥加密所有提交用于支付处理的信用卡信息。
没错,该表单提交的所有数据都将被加密,绝不会以纯文本形式发送。这是因为,重要的是要保护这里的所有数据免受攻击,而不仅仅是卡号。有效期和 CVV 是使任何特定支付方式独一无二的数据包的一部分,因此这家公司对所有数据都进行了加密。该公司绝不会以纯文本发送任何数据。
下面是一个请求样本的传输过程,使用查尔斯代理作为中间人捕获流量:
请注意,在这个示例中有两个哈希值:paymentHash 和 cvvHash。让我们思考一下这两个值中包含的数据。
对于 paymentHash,我们有 16 位数的信用卡卡号,并使用本应用程序接口发布的公钥进行了加密。显然,加密后的可用值会有很大的差异。
就 cvvHash 而言,我们的情况完全不同!CVV 只有三位数字。如果只加密三位数的组合,那么攻击者就可以建立一个包含 1000 个不同值(三位数各 10 个值)的完整字典。有了这个字典,他们就能找到通过此 API 发送的任何卡的 CVV。幸运的是,我的客户知道如何避免已知的明文攻击,并且已经实施了随机填充,以避免导致纳粹垮台的相同攻击。
破解谜团
英格马机器之所以难以破解,部分原因是它的信息加密结构非常复杂,而且设置经常改变。然而,由于该机器用于军事信息,布莱切利公园的图灵团队开始搜索许多信息中可能存在的文本。
德国军方经常发送的一种信息是天气报告,这些报告在每份信息的相同位置都包含德语 "天气 "一词,然后是已知的天气状况。另一个例子是,许多电文都以 "希特勒万岁 "结尾,而一些接线员则使用标准的敬语。通过这些例子还可以确定每天的一些纯文本和设置。
如果这家电子商务公司没有对 CVV 使用随机填充,就可能存在这种加密漏洞,因为可能的值数量非常少。
避免重蹈覆辙
通过使用随机垫,该公司确保了具有相同 CVV 的两种支付方式不会泄露任何有关传输内容的信息。下面是几个例子,说明相同的 "777 "值可以通过使用密码垫加密成不同的值:
$ echo -n 777 | openssl rsautl -inkey public_key.pem -pubin -pkcs |
如你所见,上面运行的命令都是一样的,但由于 RSA 加密的标准不同,输出的值也完全不同。
光有好的加密算法还不够
这个例子应该能帮助你理解,光有一个好的加密方案是不够的。即使是高度复杂的加密算法,如果重复使用相同的输入,也有可能暴露你试图安全传输的数据。这一点非常重要,尤其是在处理支付信息时,要确保不容易猜到通过电线发送的数值。
另一个例子是密码存储。开发人员知道,他们需要使用良好的单向散列函数,以确保即使是他们也无法读取用户提交的密码。为此,开发人员应该在对密码进行散列之前,在密码中添加一个随机字符串(称为salt)。
总结
在网络应用程序中建立安全性是一项极其重要的任务。确保用户的敏感数据不被轻易解密,可以建立客户信任,确保企业长盛不衰。毕竟,没有人希望媒体报道自己的网站泄露了客户的支付信息。如果能确保不重复加密完全相同的值,就能避免最基本的错误,同时保证客户数据的安全。
有关安全最佳实践的更多信息,请查看 Linode 的大量安全指南!
注释