我可以阻止iOS用户更改date和时间吗?

我想将托pipe的iOS设备部署到公司的员工,他们将使用的应用程序将logging将在本地logging,然后转发的数据。 我需要这些时间戳是正确的,所以我必须防止用户调整设备上的时间,logging一个值,然后重新设置date和时间。 date和时间将被configuration为自动来自networking,但设备可能一直没有networking连接(否则每次logging数据值时我只会读取networking时间)。 我在苹果configuration程序中没有看到一个选项来防止更改date和时间,那么还有其他方法可以做到吗?

您将无法阻止用户更改自己的时钟,也不能像其他评论员发布的那样直接点击您的API。 这是两个独立的问题,可以通过在设备上控制本地时间来解决,也可以通过生成发送给服务器的散列​​密钥来解决。

设备上的本地时间:

首先,在启动从服务器发回时间戳的应用程序时进行API调用; 这是你的“实际时间”。 现在把它存储在设备上,并运行一个使用手机正常运行时间的定时器(而不是mach_absolute_time()CACurrentMediaTime() – 当你的手机处于待机模式时,这些会变得奇怪)和一些math运算来增加每秒的实际时间。 我写了一篇关于如何在我的应用程序中执行此操作的文章 (请务必阅读后续内容,因为原始文章使用CACurrentMediaTime()但是有一些错误)。 您可以定期进行最初的API调用(即,如果电话进入后台并再次返回),以确保所有内容都保持准确,但只要不重新启动电话,时间应该始终正确当您下次打开应用程序更新时间时提示一个API调用)。

保护API:

您现在在设备上保证*准确的时间,但是您仍然有问题,因为有人可能会将错误的时间直接发送到您的API(即不是从您的设备)。 为了抵消这一点,我会使用某些forms的salt / hash来发送类似于OAuth的数据。 例如,把你发送的所有参数,join到一起,只用你知道的盐把它们散列,然后把生成的密钥作为一个额外的参数发送。 在你的服务器上,你知道你正在使用的散列和盐,所以你可以重build该密钥,并检查它与发送的; 如果他们不匹配,有人正试图玩你的时间戳。

警告:熟练的攻击者可能会对连接进行高级连接,以致任何对example.com/api/timestamp的调用都来自于他们设置的不同机器,这会返回他们想要的时间,从而使手机得到错误的时间开始基地。 有一些方法可以防止这种情况发生(混淆,与其他数据配对,encryption),但这个问题很快就成为一个非常开放的问题,所以最好在其他地方提出。 上述加上显示器以注意怪异时间的组合可能是最好的事情。

似乎没有什么办法可以完成你所要求的。 似乎没有办法阻止用户能够改变时间。 但除此之外,即使可以防止他们改变时间,他们也可以让设备的电池坏掉,然后插上电源,在没有networking连接的地方打开电源,直到有时间一个机会通过networking。 所以即使阻止他们改变时间也不能保证准确性。

你可以做的是需要一个networking连接来logging值,以便你可以validation服务器上的时间。 如果您必须允许它在没有networking连接的情况下工作,那么您至less应始终logging应用程序启动时的当前时间,并注意时间似乎是否倒退。 如果时间戳突然早于先前的时间戳,则会知道某些事情已经结束。 你也可以做这个检查,也许只有当他们试图logging一个值。 如果他们logging的值比先前logging的值早,那么您可以拒绝它,或logging事件,以便以后可以对此人进行询问。

这也是其中一种情况,也许你只需要信任用户不要这样做,因为似乎没有一个完美的解决scheme。

首先要注意的是,用户将始终能够伪造消息到您的服务器,以创build不正确的logging。

但是有一些有用的东西可以用来至less注意到问题。 大多数情况下,确保这种系统的最好方法是把重点放在检测上,然后公开处罚任何违背政策的人。 除非有一个警察最终会出现并阻止你,否则强大的locking毫无意义。

当然你应该首先假定任何时候的错误都是偶然的。 但只是公开“注意到”某人的设备似乎是“行为不端”往往足以使不良行为消失。

所以,你可以做什么? 首先要注意的是在服务器上出现的时间戳。 时间戳应该总是及时前进。 因此,如果您已经在星期一看过某台设备的logging,则不应该再收到前一个星期天的logging。 您的应用程序也应该如此。 您可以跟踪在NSUserDefaults中何时终止(以及将此信息发布到服务器)。 你通常不应该在过去醒来。 如果你这样做,抱怨你的服务器。

注意UIApplicationSignificantTimeChangeNotification 。 如果手动更改时间,我相信你会收到它(在其他几种情况下也会收到,其中大部分是良性的)。 注意时间大幅倒退。 抱怨你的服务器。

注意mach_absolute_time() 。 这是自设备启动以来的时间,用户在没有越狱的情况下是不能修改的。 区分重启和其他事件很有用。 这是一个奇怪的时间单位,但可以按照QA1398中的描述转换为人力时间。 如果机器时差比挂钟时间长一个多小时,则有些奇怪(DST变化可能导致1小时)。 向你的服务器投诉。

所有这些都可能是良性的。 人类需要调查并作出决定。

如果有一个专门和熟练的攻击者参与,这些事情都不会确保你的logging是正确的。 正如我所说,一个专门和熟练的攻击者可以给你发送假消息。 但是,这些事情,加上监督和纪律处分,使得内部人士甚至试图如何击败系统是危险的。

你不能阻止用户改变时间。
即使一个位置的时间是由苹果公司调整,而不是一个真正的GPS时间。 你可以看看马赫内核时间,这是一个相对的时间。
比较那与上次networking连接的时间。

但这一切听起来都不可靠。