我们在 Apple 和 Google Play 商店中提供适用于 iOS 和 Android 的移动应用程序。该应用程序通过 HTTPS 与我们服务器的 Web 服务进行通信。
我们让攻击者能够欺骗应用程序流量。这可能意味着我们的攻击者正在使用Fiddler等工具解密和监视 HTTPS 加密的 Web 服务请求/响应。
我们的下一步是在移动应用程序内部进行加密。我们使用带有 HMAC 的 CBC 模式中的 AES 双向加密 Web 服务有效负载。这意味着我们的服务器和可下载的移动应用程序都有一个共享的密钥(实际上,至少有两个)。
问题是很可能对 iOS 或 Android 移动应用程序进行逆向工程并获取任何密钥。可以肯定的是,我们有更高级别的安全性。与通过 Fiddler 观察 HTTPS 流量相比,对移动应用程序进行逆向工程需要更多的专业知识。
对于任何人来说,我们可能不是一个足够大的目标来获取我们的密钥。但我们希望发展到值得攻击的地步!
我知道的任何密钥交换协议都要求移动应用程序在过程中的某个地方有一个密钥。该应用程序可以从 Apple App Store 和 Google Play 免费下载,我根本无法确保它的秘密仍然是秘密的。
Arxan.com声称提供了一种企业级解决方案,该解决方案似乎是一个非常复杂的过程,可以将密钥隐藏起来以防潜在的攻击者。我还没准备好向他们询问定价!
从一个角度来看,我的问题是,“我如何保护野外移动应用程序中的密钥?” 我看到了两个明确的答案:
- 你不能。
- 使用 HTTPS。但是,我们这样做了,我们很清楚我们的流量仍在受到监控。
所以,我认为我的问题变成了身份验证而不是授权:在服务器端,我如何区分伪装成我们移动应用程序的攻击者和来自我们应用程序的合法流量?
假设我们正在加密并正确使用 HMAC,一条有效消息告诉我们:
- 消息未更改。
- 发件人拥有我们的共享密钥。
到目前为止,一切都取决于不被泄露的密钥。
到目前为止,我唯一想到的答案是流量分析。我们检测暴力攻击流量和某些其他流量配置文件。我们检测各种形式的重放攻击。
因此,我们可以推断出我们的密钥已被泄露(如果有的话),并使密钥无效(从而使所有移动安装都无效)。但按理说,如果攻击者可以找出一个密钥,那么该攻击者也可以找出下一个密钥。我们也不想让整个合法的已安装应用程序用户群失效!
我们可以在我们的应用程序中安装证书,但这能解决问题吗?如果是这样,怎么办?难道我们没有同样的应用程序被逆向工程和欺骗的问题吗?
编辑:我们要保护什么?
我们的攻击者可以通过欺骗我们应用的用户登录网络序列来针对我们运行密码列表。由于我们的攻击者能够在退出应用程序时观察 HTTPS 流量,因此我们的攻击者知道如何构建 Web 服务请求和身份验证。
我们可以在登录(和其他)信息离开应用程序之前对其进行加密。假设我们的攻击者不拥有加密中使用的密钥,这应该可以防止嗅探和欺骗。
鉴于入站(到服务器)流量对保护更重要,公钥加密将成为可能。只有服务器可以解密它。但是,由于密钥是公开的,我们的攻击者仍然可以假装应用程序运行密码列表。
那么我们想要保护什么?我们正在努力保护自己免受攻击者通过我们的网络服务侵入用户帐户。具体来说,我们如何保护自己免受有足够动机在野外对我们的移动应用程序进行逆向工程的攻击者的攻击?
第二次编辑:让我们尝试重述问题。
我们如何设计一个健壮且安全的 Web 服务 API?它必须能够经受住潜在攻击者的观察。我们必须能够区分和拒绝来自潜在攻击者的虚假信息。
具体来说,我们希望:
防止我们的攻击者使用我们的 Web 服务 API 运行密码列表并可能登录到成员帐户。我们还有其他暴力检测措施,但我们希望直接保护我们的 API 免受此类攻击。
防止我们的攻击者使用我们的 Web 服务 API 来探测我们的服务器是否存在其他攻击可能性。