我想将托管的iOS设备部署到公司的员工,他们将使用的应用程序将为本地记录的数据加时间戳,然后转发.我需要这些时间戳是正确的,所以我必须阻止用户调整设备上的时间,记录一个值,然后重置日期和时间.日期和时间将被配置为自动来自网络,但设备可能始终没有网络连接(否则每次记录数据值时我只会读取网络时间).我还没有在Apple Configurator中看到一个选项来阻止更改日期和时间,那么有没有其他方法可以做到这一点?
您将无法阻止用户更改其时钟或仅像其他评论员发布的那样直接访问您的API.这是两个独立的问题,可以通过在设备上控制本地时间并生成发送到服务器的散列密钥来解决.
设备上的本地时间:
首先,在启动从服务器发回时间戳的应用程序时进行API调用; 这是你的"实际时间".现在将其存储在设备上并运行一个使用电话正常运行时间功能的计时器(不是mach_absolute_time()或者CACurrentMediaTime()- 当手机处于待机模式时会变得怪异)和一些数学运算来增加每秒的实际时间.我写过一篇关于我如何为我的一个应用程序执行此操作的文章(请务必阅读后续内容,因为原始文章使用CACurrentMediaTime()但有一些错误).您可以定期进行初始API调用(即,如果手机进入后台并再次返回),以确保一切都保持准确,但只要您不重新启动手机,时间应始终正确(应该在您下次打开应用程序以更新时间时提示API调用.
保护API:
您现在可以在设备上保证*准确的时间,但是您仍有一个问题,即有人可能会错误地将时间发送到您的API(即不是从您的设备).为了抵消这种情况,我会使用某种形式的salt/hash来发送类似于OAuth的数据.例如,获取您要发送的所有参数,将它们连接在一起并使用只有您知道的盐哈希它们并将该生成的密钥作为额外参数发送.在您的服务器上,您知道正在使用的哈希值和盐,因此您可以重建该密钥并使用发送的密钥进行检查; 如果他们不匹配,有人正试图玩你的时间戳.
*警告:技术娴熟的攻击可能会使连接高枕无忧,因此任何对example.com/api/timestamp的调用都来自他们设置的不同机器,这会返回他们想要的时间,以便手机被给予错误的时间作为起点基地.有一些方法可以防止这种情况(混淆,将其与其他数据配对,加密),但这很快就成为一个非常开放的问题,所以最好在其他地方提出.上述和监视器的组合可以发现奇怪的时间可能是最好的.
| 归档时间: |
|
| 查看次数: |
8312 次 |
| 最近记录: |