android - 验证消息来自特定的应用程序/端点

标签 android security ssl cryptography drm

我正在尝试构建一个安全系统,用于将数据从客户端 Android 应用程序传输到运行 PHP 的网络服务器。

我想做的是确保系统是加密安全的,这样来自应用程序的消息可以被验证为实际上来自应用程序本身,而不是来自可能编写了自定义程序的狡猾用户脚本或可能使用 cURL 来玩弄系统。

这种验证有很多用例,例如:-

  • 如果某个应用包含您从中收集指标的广告,您需要验证点击数据是从该应用发送的,而不是来自已经弄清楚您的 API 并正在发送虚拟数据的恶意用户.

  • 该应用可能有一项多项选择调查,同样,您需要确保从该应用收集调查结果。

  • 该应用正在收集 GPS 轨迹,您希望确保数据是从该应用本身发送的。

在每种情况下,您都希望确保消息的来源是应用程序本身,而不仅仅是运行简单脚本来伪造数据的用户。

我考虑过的一些想法:-

  • SSL - 可以很好地保护 channel 和防止篡改(满足一些要求),但仍然不能确保数据源的完整性。

  • 公钥密码学 - 客户端应用程序可以使用私钥加密数据,然后将其传输到可以解码的服务器。问题是私钥需要在应用程序中进行硬编码——应用程序可以被反编译并提取私钥,然后用于发送虚假数据。

  • Home-made algorithms - 问了一个与此非常相似的问题 here解决方案只在“有人想出你的算法”之前有效——也就是说,这不是一个很好的解决方案!

  • Hash chain - 这似乎是一种使用一次性 key 验证从客户端到服务器的每个数据有效负载的非常有趣的方式,但它再次依赖于应用程序本身没有被反编译,因为密码仍然需要存储应用程序。

我对密码学的有限了解使我认为实际上理论上 不可能 构建一个以这种方式完全可验证的系统,因为如果我们不能信任最终客户或 channel ,那么没有什么可以建立任何信任的基础......但也许我忽略了一些事情!

最佳答案

这并不难,您只需要对应用进行身份验证即可。您可以使用简单的用户和密码(通过 SSL)或使用客户端身份验证来执行此操作。在这两种情况下,凭据都需要在应用程序中,攻击者可以提取它们并冒充应用程序。你必须离开它并可能实现一些方法来减轻它。

您还可以通过使用非对称 key (RSA 等)或对称 key (HMAC 等)对消息进行签名来验证消息。随机数有助于防止重放,即有人捕获有效签名的消息并将其一遍又一遍地发送到您的服务器。根据您的协议(protocol),使用一个的开销可能太多。

为了保护凭据,您可以让客户端生成它们并将它们保存在系统 KeyStore 中,尽管公共(public) API 不完全支持它,请参阅 here一些细节。当然,这需要一个额外的步骤,您需要将生成的凭据(例如,公钥)安全地发送到您的服务器,这可能很难正确实现。

无论您做什么,都不要尝试发明您自己的密码算法或协议(protocol),而要使用已建立的算法或协议(protocol)。

关于android - 验证消息来自特定的应用程序/端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13939870/

相关文章:

安卓。 notifyDataSetChanged() 方法和 ListViews 是如何工作的?

android - 如何设置WorkManager后台上传

android - 应如何在 AsyncTaskLoader 内处理 SQLiteDatabase 连接?

database - 带有数据库 : java. lang.ClassNotFoundException : org. springframework.security.core.userdetails.jdbc.JdbcDaoImpl 的 Spring Security 应用程序

java - 无法使用 java 小程序在 MAC 上创建文件和文件夹 - 不允许操作

ssl - 配置导入的自签名 SSL 证书到 SQL Server Express

Android onLocationChanged GPSTracker 崩溃

PHP - 在 $_SESSION 超全局中存储任何内容是否安全?

用于构建支持 SSL 的 uWSGI 的 Dockerfile

python - 如何使用urllib2获取使用SSLv3加密的网页