为APNs安全地发送设备令牌

4
对于需要推送通知的iOS应用程序,必须首先请求用户许可。然后会生成设备令牌,通过该令牌,远程服务器可以与用户进行通信。
我已经阅读了类似问题这里,但我认为不够。下面的图片是一个可信证书,它允许我查看在该设备上发生的所有流量。

通过 Fiddler2CertMaker,我可以嗅探HTTPS流量,这意味着客户端可能知道他们正在发送什么数据以及发送到哪里。

我的问题是,既然SSL不能保护我的客户端免受查看我发送到远程服务器的内容,那么我是否应该只使用应用程序中找到的秘密密钥进行加密?

比如 encrypt("device_token","secretkey_a0a0a0a")(假设这是Objective-C)?

难道不会有人在我的应用程序中找到那个密钥吗?我也读过this的问题,似乎可以找回秘密密钥。

我的计划如下:

  1. 在iOS应用程序中,生成一个名为activate的随机字符串。
  2. 使用随机字符串只有我知道的秘钥(secretkey_a0a0a0)对令牌进行加密(不是哈希)。
  3. 将加密后的字符串与生成的随机字符串(active)一起发送。
  4. 在服务器端,使用active和我的秘钥检查是否可以解密有效的令牌。
  5. 如果令牌有效,则将其保存在我的数据库中。

这可以防止人们随意输入令牌,但是,secretkey_a0a0a0是一个字符串字面量。很可能在应用程序二进制文件本身中找到它。

我的问题是,如何保护这个秘钥?答案也可以是,如何防止人们向我的服务器发送无效的令牌。

我听说过加密,但那不仅适用于资源文件吗?

我应该如何处理这个问题?


2
你有点过于担心了。SSL已经足够安全了。一旦应用程序离开你的手,它就可能被破解。只需要问问那些花费了数百万、甚至数十亿美元在数字版权管理上的公司,看看它们的DRM系统是否在几个小时内就被破解了。你真的认为你能做得更好吗? - Kevin
你为什么想要加密设备令牌?如果任何人都可以读取它,会造成什么危害? - Martin R
为了使其可以在服务器端验证,我希望防止人们发送虚假令牌。每当有人发送一个令牌时,它会立即添加到我的数据库中。 - Dave Chen
4个回答

3

如果你担心中间人攻击会窃取你的令牌并向你应用程序的用户发送虚假推送通知,请放心,这种情况不会发生。由于向苹果apn服务器的请求必须使用pem文件签名,因此主要问题应该是如何保护证书文件的安全,而不是apn令牌。如果您想防止在数据库中写入无效令牌,则应实现一些CRC或奇偶比特机制。


3

如果您使用SSL Pinning(AFNetworking已经实现了这个功能),除非您拥有服务器的私钥,否则在合理的时间内无法嗅探客户端和服务器之间的https流量。


哇,我从来不知道你可以强制客户端使用特定的证书。谢谢,接受了,点赞并授予悬赏! - Dave Chen
1
SSL pinning是将由主机提供的凭据与期望进行匹配。客户端检查远程主机提供的证书,如果不符合预期值,则客户端会中止连接。在那一点之后,就没有流量可以嗅探了。请参见:https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning#What_Is_Pinning.3F - quellish

2
您可能想要查看推送通知指南中的安全部分,特别是标题为“令牌生成和分散”的部分。
设备令牌是通过设备连接到苹果的APNS生成的。我的猜测(文档中没有说明)是对于给定的应用程序标识符它是唯一的。
然后,APNS可能会将这些标识符与您用于与其通信的pem证书进行匹配,从而验证推送通知实际上是来自您的应用程序。
在这种情况下,对设备令牌进行加密似乎有点过度了。

我担心他们可以嗅探到令牌发送的位置,并发送一堆假令牌。 - Dave Chen

0
为了防止有人恶意地使用令牌垃圾邮件攻击您的服务器,我建议在发送令牌时对其进行哈希处理,并将令牌和哈希值一起发送到服务器。然后,在服务器上再次使用您的秘密密钥对令牌进行哈希处理,并检查请求是否有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接