我想为公司员工部署托管 iOS 设备,他们将使用的应用程序将为数据添加时间戳,这些数据将在本地记录,然后转发。我需要这些时间戳是正确的,因此我必须防止用户调整设备上的时间、记录值,然后重置日期和时间。日期和时间将配置为自动来自网络,但设备可能无法始终具有网络连接(否则我只会在每次记录数据值时读取网络时间)。我在 Apple Configurator 中没有看到阻止更改日期和时间的选项,那么还有其他方法可以做到这一点吗?
您将无法阻止用户更改时钟或像其他评论员所发布的那样直接点击您的 API。这是两个独立的问题,可以通过在设备上控制本地时间并生成发送到服务器的内容的散列密钥来解决。
设备当地时间:
首先,在启动应用程序时进行 API 调用,该调用会从服务器发回时间戳;这是你的“实际时间”。现在将其存储在设备上并运行一个使用电话正常运行时间功能的计时器(不是mach_absolute_time()
or CACurrentMediaTime()
- 当你的手机处于待机模式时,这些会变得很奇怪),并且需要一些数学来增加每秒的实际时间。我有写了一篇关于我是如何做到这一点的文章对于我的应用程序之一(请务必阅读跟进正如原始文章所使用的CACurrentMediaTime()
但这有一些错误)。您可以定期进行初始 API 调用(即,如果手机进入后台并再次返回),以确保一切保持准确,但只要您不重新启动手机,时间就应该始终正确(这应该当您下次打开应用程序以更新时间时提示 API 调用)。
保护 API 的安全:
现在,您的设备上的时间有保证*准确,但仍然存在一个问题,因为有人可能会直接向您的 API 发送错误的时间(即不是从您的设备)。为了解决这个问题,我会使用某种形式的盐/散列来处理您发送的数据,类似于 OAuth。例如,获取您要发送的所有参数,将它们连接在一起并使用只有您知道的盐对其进行哈希处理,然后将生成的密钥作为额外参数发送。在您的服务器上,您知道正在使用的哈希值和盐,因此您可以重建该密钥并与发送的密钥进行检查;如果它们不匹配,则表明有人试图篡改您的时间戳。
*警告:熟练的攻击者可能会劫持连接,以便对 example.com/api/timestamp 的任何调用都来自他们设置的另一台机器,该机器返回他们想要的时间,从而使手机得到错误的时间起始基地。有一些方法可以防止这种情况(混淆、将其与其他数据配对、加密),但这很快就会成为一个非常开放的问题,因此最好在其他地方询问。将上述功能与监视器相结合以注意到奇怪的时间可能是最好的事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)