如何保护应用程序 – 后端通信?

我有一个iOS应用程序和一个小的后端,我用它来管理apns(Apple推送通知)。 注册过程只是一个带有参数的GET调用到我的后端,并且由于没有“身份validation”或任何其他类型的控制,我担心任何人都可能只是假装设备注册时超载我的后端。

所以主要的问题是:如果没有身份validation,我怎样才能使这种app-sending-info-to-backend传输安全?

我想到的一个简单想法是使用app在注册设备时必须提供的令牌来生成某种HASH …

没有办法彻底解决这个问题。 无法知道您的应用是否正在连接。 你所能做的就是添加一点混淆。

您最好的第一步是使用带有固定证书的SSL,以使中间人攻击变得更加困难。 客户端证书可以提供帮助,但设置起来有点痛苦,并且不会比其他解决方案更多地为您买单。

如果您有固定证书和SSL,只需发送共享密钥和GET就可以满足您的需求。 将密钥从发布更改为发布,以便您可以使旧版本老化。 如果有人对您的应用程序进行了反向设计,足以击败固定证书(或直接读取共享密钥),那么他们也将打破其余所有这些方法。

即便如此,这里还有一些额外的添加:

使用AES进行双向共享密钥validation是一种很好而且简单的方法,但需要握手(即,您无法使用单个GET进行)。 您当然可以单向实现(因此服务器validation密钥,但不validation客户端),但您仍需要握手。

如果你想让你的auth令牌保持一个GET并且无法固定你的SSL证书,你可以使你的GET具有幂等性(无论如何都应该有好的REST调用),那么这是一个简单的实现:

  • 构造GET请求
  • 计算HMAC(SHA-256,共享密钥,get-request,16字节)
  • 发送HMAC以及GET请求

在iOS上,这看起来像:

NSData *key = ...random 32 bytes shared with server...; NSURLRequest *request = ...; // Allocate some memory for the HMAC NSMutableData *hmac = [NSMutableData dataWithCapacity:CC_SHA256_DIGEST_LENGTH]; // Convert your URL into data. This assumes that this is a GET request, so the URL // has everything. This also assumes that the GET is idempotent, so if someone // replays this GET request, you don't care. NSData *requestData = [[[request URL] absoluteString] dataUsingEncoding:NSUTF8StringEncoding]; // Compute the HMAC CCHmac(kCCHmacAlgSHA256, [key bytes], [key length], [requestData bytes], [requestData length], [hmac mutableBytes]); // Truncate the HMAC (this is common practice. It's slightly better, and at least no // worse, to send half the HMAC rather than the whole HMAC). NSData *token = [hmac subdataWithRange:NSMakeRange(0, [hmac length] / 2)]; NSURLRequest *finalRequest = ... add the token to your request ... 

你当然会在服务器端计算相同的东西。 您可以将此视为“签署GET”。 如果你的请求不是幂等的,你真的应该努力修复它。 如果您无法解决问题,可以将时间戳集成到哈希中,并丢弃过时或以前见过的请求。 (在这样做的过程中,你已经使你的GET成为幂等的……)

升级应用程序时,您应该更改共享密钥。 这样,您最终可以老化已发现的旧共享秘密。

是的,这些都可以进行逆向工程。 任何试图validation应用程序(而不是用户)的东西都可以进行逆向工程。 所以保持简单,并更多地关注如果它确实发生你将如何恢复。

如果可能的话,添加用户身份validation。 它更强大。

哈希的想法应该工作(少注意SHA-256不会出现冲突,MD5不再安全)但它取决于权衡,如果服务涉及真正非常关键的东西,客户端SSL证书将是继续前进的最佳方式。

设备上的任何内容都可供确定的攻击者使用。

我会从有问题的令牌中生成设备上的哈希值,并在注册APN令牌时将其发送到后端。 使用HTTPS。

如果有人想用假注册重载你的后端,他们至少必须反编译应用程序以查看哈希是如何生成的。

让设备在设备注册时检查令牌的哈希值。

通过注册保存设备IP号和时间戳。 如果您发现来自同一IP号码的注册数量不合理,请暂停注册,并对此情况进行人工审核。 如果一切正常,请释放注册。