如何安全地验证向我发送数据的客户端应用程序?

信息安全 应用安全 验证 客户端
2021-08-31 15:08:55

我们有一个 Web 服务记录/记录我们的客户端应用程序通过 https 发送的用户数据。有没有办法安全地确保数据是由客户端应用程序发送的,而不是由冒充我们应用程序的虚假工具发送的?理想情况下,我不想求助于诸如在客户端中隐藏混淆密钥或其他“通过保密的安全”技术之类的东西……

4个回答

你不能。服务器从根本上不能信任客户端(有一些例外 - 如果客户端机器被强化(硬件验证固件,固件验证操作系统,操作系统验证每个正在运行的应用程序),可能会这样做(但不是真的 - 某人用烙铁总是可以修改硬件验证),但如果你不能 100% 控制客户端,那你就有点不走运了。

您需要问自己:客户端上传虚假数据的风险是什么?不验证是您的应用程序上传数据的后果是什么?您应该问一个难题:客户是否有动机上传虚假数据?如果用户没有上传虚假数据的动机,他们可能不会打扰。

您可以做的一件事:您可以对运行应用程序的用户进行身份验证(通过多种身份验证机制中的任何一种),然后将上传的数据与经过身份验证的用户 ID(和 IP 地址)一起保存。这样,如果用户确实上传了虚假数据,您就可以追溯是谁做出了更改。当然,您现在已经制作了可能对您的服务有隐私问题的数据 PII。

您确实需要对客户端进行身份验证,这需要有某种秘密。如果人类用户正在控制客户端,您可能只能使用他们知道或有权访问的某些秘密来注册和验证用户。

如果客户端是自动化的,并且您无法控制客户端所依赖的硬件和软件环境,那么面对控制客户端的坚定攻击者,您将不走运。但是你可以让它变得困难。

您的问题似乎与许可客户端应用程序的一般问题有关,这里有一个很好的概述(对于 android 应用程序,在 Java 中)的一种方法:

http://android-developers.blogspot.com/2010/09/securing-android-lvl-applications.html

您可以使其适应您的环境或寻找适合您情况的其他开源库。

顺便说一句,“保密安全”很好——像私钥这样的秘密是大多数好的方案的一部分。人们试图避免的是“通过默默无闻的安全”,即只是让事情变得复杂,或者假装攻击者不会理解你的算法。

如果你看一下10 条不变的安全法则,第 3 条法则从根本上解释了这个问题:

法则 3:如果坏人可以不受限制地物理访问您的计算机,那么它就不再是您的计算机了

您可以使用 kerberos 在客户端和服务器之间执行相互身份验证。您最好有一些带外方法来初始识别客户端,例如向用户发出标识符。当然,您现在依靠该标识符不会受到损害...