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

apa*_*ual 3 security backend apple-push-notifications ios

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

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

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

Rob*_*ier 7

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

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

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

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

使用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 ...
Run Code Online (Sandbox Code Playgroud)

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

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

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

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