apa*_*ual 3 security backend apple-push-notifications ios
我有一个iOS应用程序和一个小的后端,我用它来管理apns(Apple推送通知).注册过程只是一个带有参数的GET调用到我的后端,并且由于没有"身份验证"或任何其他类型的控制,我担心任何人都可能只是假装设备注册过载我的后端.
所以主要的问题是:如果没有身份验证,我怎样才能使这种app-sending-info-to-backend传输安全?
我想到的一个简单想法是使用app在注册设备时必须提供的令牌来生成某种HASH ...
没有办法彻底解决这个问题.无法知道它是您的应用程序正在连接.你所能做的就是添加一点混淆.
您最好的第一步是使用带有固定证书的SSL,以使中间人攻击变得更加困难.客户端证书可以提供帮助,但设置起来有点痛苦,并且不会比其他解决方案更多地为您买单.
如果您有固定证书和SSL,只需发送共享密钥和GET就可以满足您的需求.将密钥从发布更改为发布,以便您可以使旧版更老.如果有人对您的应用程序进行了反向设计,足以击败固定证书(或直接读取共享密钥),那么他们也将打破其余所有这些方法.
即便如此,这里还有一些额外的添加:
使用AES进行双向共享密钥验证是一种简单易用的方法,但需要握手(即您无法通过单个GET进行).您当然可以单向实现(因此服务器验证密钥,但不验证客户端),但仍需要握手.
如果你想让你的身份验证令牌保持一个GET并且无法固定你的SSL证书,你可以使你的GET具有幂等性(无论如何都应该有好的REST调用),那么这是一个简单的实现:
在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成为幂等的......)
升级应用程序时,您应该更改共享密钥.这样,您最终可以老化已发现的旧共享秘密.
是的,这些都可以进行逆向工程.任何试图验证应用程序(而不是用户)的东西都可以进行逆向工程.所以保持简单,并更多地关注如果它确实发生你将如何恢复.
如果可能的话,添加用户身份验证.它更强大.
| 归档时间: |
|
| 查看次数: |
2834 次 |
| 最近记录: |