我想做的第一件事是澄清你的期望。
数据有两个方面对您很重要:
- 身份验证- 发送给您的数据是从授权的、未经修改的程序发送的
- 完整性- 发送给您的数据在传输过程中没有被修改。
完整性问题更容易解决,只需让您的程序使用 SSL 连接到服务器即可。您甚至不需要使用由普通 CA 签名的证书,实际上最好不要使用!您可以为您的应用程序创建一个 CA,然后自己签署将在具有该私有 CA 的网络服务器上运行的证书。如果这样做,您可以将 CA 的公钥硬编码到程序中,并且只允许它连接到具有由您的私有 CA 签名的证书的服务器。这样做将有助于防止有人设置 MITM SSL 代理(例如Fiddler)在传输数据时对其进行编辑。
身份验证是一个更难解决的问题。您需要防止虚假客户端或修改过的真实客户端连接到您的服务器并发送虚假数据,这不是一个容易解决的问题。如果您的软件在攻击者可以运行任意代码的设备上运行,则问题无法解决。不可能的原因是用户可以附加调试器并逐步执行您的代码并复制您的过程。“解决”它的唯一方法是在不允许用户运行任何东西的东西上运行你的程序,并且任何运行的软件都必须首先由第 3 方审查(如未越狱的电话)。
然而,你可以“缓解”问题,你不需要让它变得不可能,只要足够困难,任何恶意用户都不会觉得克服你设置的障碍是值得的。
您可以做一些事情来使攻击者更难:
- 所有消息都使用您竭尽全力隐藏的密钥进行签名。
- 在代码上使用代码混淆器以使其更难进行逆向工程。
- 在您的 SSL 连接中使用客户端证书,并让您的服务器拒绝任何没有它们的连接。
- 比你更有经验的顾问让你的代码更难逆向工程。
还有很多事情可以做,但这就是我想了几分钟的想法。
因此,将这一切归结为,如果您不太担心,只需使用沼泽标准 SSL,这可能会阻止 75% 的篡改。如果您更担心,请使用自定义 CA 技巧来阻止任何 SSL MITM 攻击,以使您获得高达 80% 的攻击。但是,如果你想超过 80%,它会成倍地难以做到,并且在某些时候你需要停下来问问自己“我投入的时间/精力/金钱是不是为了阻止更多的人向我发送这些糟糕的数据值得吗?或者我可以忍受 100 个人中的 20 个人向我发送不良数据,那么 10、5、1 呢?