我有一个iOS应用程序,还有一个我用到目前为止管理apns(Apple推送通知)的小后端。注册过程只是一个带有参数的GET调用到我的后端,由于没有“身份验证”或任何其他类型的控制,我担心任何人都可能因伪造设备注册而超载我的后端。
所以主要的问题是:如果没有身份验证,我怎样才能使这种app-sending-info-to-backend传输安全?
我想到的一个简单想法是使用app在注册设备时必须提供的令牌来生成某种HASH ......
答案 0 :(得分:7)
没有办法彻底解决这个问题。无法知道它是您的应用程序正在连接。你所能做的就是添加一点混淆。
你最好的第一步是使用SSL with a pinned certificate来加强中间人攻击。客户端证书可以提供帮助,但设置起来有点痛苦,并且不会比其他解决方案为您买单。
如果您拥有固定证书和SSL,只需发送共享密钥和GET就可以满足您的需求。将密钥从发布更改为发布,以便您可以使旧版更老。如果某人对您的应用程序进行了反向设计,足以击败固定证书(或直接读取共享密钥),那么他们也将打破其余所有这些方法。
即便如此,这里还有一些额外的添加:
Bidirectional shared-secret verification with 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 ...
你当然会在服务器端计算相同的东西。您可以将此视为“签署GET”。如果你的请求不是幂等的,你真的应该努力修复它。如果您无法修复它,您可以将时间戳集成到哈希中,并丢弃过时或以前见过的请求。 (在这样做的过程中,你已经使你的GET成为幂等的......)
升级应用时,您应该更改共享密码。这样你最终可以老化已发现的旧共享秘密。
是的,这些都可以进行逆向工程。尝试验证应用程序(而不是用户)的任何可以进行逆向工程。所以保持简单,并更多地关注如果它确实发生将如何恢复。
如果可能的话,添加用户身份验证。它的功能更强大。
答案 1 :(得分:1)
散列思想应该有效(小调说SHA-256不会出现冲突,MD5不再安全)但是它取决于权衡,如果服务涉及真正非常关键的东西,客户端SSL证书将是最好的继续方式。
答案 2 :(得分:1)
设备上的任何内容都可供确定的攻击者使用。
我会从相关令牌生成设备上的哈希值,并在注册APN令牌时将其发送到后端。使用HTTPS。
如果有人想用假注册过载你的后端,他们至少必须反编译应用程序以查看哈希是如何生成的。
让服务器在设备注册时检查令牌的哈希值。
使用注册保存设备IP号和时间戳。如果您发现来自同一IP号码的注册数量不合理,请暂停注册,并对此情况进行人工审核。如果一切正常,请释放注册。