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

时间:2014-02-17 15:18:34

标签: ios security apple-push-notifications backend

我有一个iOS应用程序,还有一个我用到目前为止管理apns(Apple推送通知)的小后端。注册过程只是一个带有参数的GET调用到我的后端,由于没有“身份验证”或任何其他类型的控制,我担心任何人都可能因伪造设备注册而超载我的后端。

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

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

3 个答案:

答案 0 :(得分:7)

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

你最好的第一步是使用SSL with a pinned certificate来加强中间人攻击。客户端证书可以提供帮助,但设置起来有点痛苦,并且不会比其他解决方案为您买单。

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

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

Bidirectional shared-secret verification with AES是一种简单易用的方法,但需要握手(即单个GET无法做到)。您当然可以单向实现(因此服务器验证密钥,但不验证客户端),但仍需要握手。

如果你想让你的身份验证令牌保持一个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成为幂等的......)

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

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

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

答案 1 :(得分:1)

散列思想应该有效(小调说SHA-256不会出现冲突,MD5不再安全)但是它取决于权衡,如果服务涉及真正非常关键的东西,客户端SSL证书将是最好的继续方式。

答案 2 :(得分:1)

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

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

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

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

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