为 APN 安全发送设备令牌

Posted

技术标签:

【中文标题】为 APN 安全发送设备令牌【英文标题】:Sending Device Token Safely for APNs 【发布时间】:2013-07-01 04:34:08 【问题描述】:

对于需要推送通知的 ios 应用程序,它必须首先请求用户允许这样做。之后,生成一个设备令牌,远程服务器可以通过这个令牌与用户进行通信。

我读过一个类似的问题here,但我觉得这还不够。下图是受信任的证书,它允许我查看此设备上发生的所有流量。

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

我的问题是,我知道 SSL 不安全,无法保护我的客户看到我发送到远程服务器的内容,我是否应该简单地使用在我的应用程序中找到的密钥加密?

encrypt("device_token","secretkey_a0a0a0a")(假装这是Objective-C)?

难道不能有人在我的应用程序中找到该密钥吗?我也看了this的问题,好像可以找回秘钥了。

我的计划是这样的:

    在 iOS 应用程序中,生成一个名为 activate 的随机字符串。 用随机字符串加密(不是散列)令牌,我只知道密钥。 (secretkey_a0a0a0) 将加密字符串与随机生成的字符串一起发送(活动)。 在服务器端,我检查是否可以使用 active 和我的密钥解密有效令牌。 如果令牌有效,我会将令牌保存在我的数据库中。

这可以防止人们随机输入标记是的,但是,secretkey_a0a0a0 是一个字符串文字。很有可能在应用程序二进制文件本身中得到它。

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

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

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

【问题讨论】:

你太偏执了。 SSL 已经足够了。一旦应用程序脱离您的控制,它就可能被破坏。只需询问所有在 DRM 上花费数百万甚至数十亿美元的公司,就会发现它在数小时内就被破坏了。你真的认为你可以做得更好吗? 为什么要加密设备令牌?如果有人能读到,会有什么危害? 以便它可以在服务器端进行验证。我想防止人们发送假令牌。每当有人发送令牌时,它都会立即添加到我的数据库中。 @DaveChen:我明白了,谢谢! 【参考方案1】:

如果您进行 SSL-Pinning(AFNetworking 已实现此功能),如果您没有服务器私钥,您将无法(在合理的时间范围内)嗅探客户端和服务器之间的 https 流量。

【讨论】:

哇,我从来不知道你可以强制客户端使用特定的证书。谢谢,接受,投票和赏金! SSL pinning 将 host 提供的凭据与预期相匹配。客户端检查远程主机提供的证书,如果它与预期值不匹配,则客户端中止连接。超过那个点就没有流量可以嗅探了。见:owasp.org/index.php/…【参考方案2】:

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

【讨论】:

【参考方案3】:

您可能需要检查Push Notifications Guide 中的安全部分,特别是标题为“令牌生成和分散”的部分

设备令牌由设备通过 Apple 的 APNS 连接生成。我的猜测(他们在文档中没有说)是它对于给定的应用标识符是唯一的。

然后,APNS 可能会将这些标识符与您用来与之通信的 pem 证书进行匹配,从而验证推送通知实际上来自您的应用程序。

在这种情况下,加密设备令牌似乎有点过头了。

【讨论】:

恐怕他们可以嗅探到令牌的发送位置——然后自己发送一堆假的。【参考方案4】:

为了防止有人使用令牌恶意向您的服务器发送垃圾邮件,我会在密钥时对令牌进行哈希处理,并将令牌和哈希发送到服务器。然后,您可以使用您的密钥在服务器上再次对令牌进行哈希处理,并检查请求是否有效。

【讨论】:

以上是关于为 APN 安全发送设备令牌的主要内容,如果未能解决你的问题,请参考以下文章

通过 FCM 发送推送通知时何时使用 iOS 设备令牌?

同一应用程序的不同 APN 设备令牌 ID

如何为拥有多个设备的用户管理 APN 令牌?

多用户的 APN 设备令牌

离子推送 - 未在设备上获取令牌

获取 APNS 服务的设备令牌列表