我想将托管的iOS设备部署到公司的员工,他们将使用的应用程序将为本地记录的数据加时间戳,然后转发。我需要这些时间戳是正确的,所以我必须阻止用户调整设备上的时间,记录一个值,然后重置日期和时间。日期和时间将被配置为自动来自网络,但设备可能始终没有网络连接(否则每次记录数据值时我只会读取网络时间)。我还没有在Apple Configurator中看到一个选项来阻止更改日期和时间,那么有没有其他方法可以做到这一点?
答案 0 :(得分:7)
您将无法阻止用户更改时钟或直接按其他评论员发布的方式直接访问您的API。这是两个独立的问题,可以通过设置您在设备上控制的本地时间以及生成发送到服务器的散列密钥来解决。
设备上的本地时间:
首先,在启动从服务器发回时间戳的应用程序时进行API调用;这是你的“实际时间”。现在将其存储在设备上并运行一个使用电话正常运行时间功能的计时器(不是mach_absolute_time()
或CACurrentMediaTime()
- 当手机处于待机模式时会变得很奇怪)并且需要一些数学运算来增加实际功能每秒钟的时间。对于我的某个应用,我written an article on how I did this(请务必阅读follow up,因为原始文章使用CACurrentMediaTime()
,但有一些错误)。您可以定期进行初始API调用(即,如果手机进入后台并再次返回),以确保一切都保持准确,但只要您不重新启动手机,时间应始终正确(应该下次打开应用程序以更新时间时提示API调用。
保护API:
您现在可以在设备上保证*准确的时间,但您仍有一个问题,即有人可能会错误地将时间发送到您的API(即不是从您的设备)。为了抵消这种情况,我会使用某种形式的salt / hash来发送类似于OAuth的数据。例如,获取您要发送的所有参数,将它们连接在一起并使用只有您知道的盐哈希它们并将该生成的密钥作为额外参数发送。在您的服务器上,您知道正在使用的哈希值和盐,因此您可以重建该密钥并使用发送的密钥进行检查;如果他们不匹配,有人会试着玩你的时间戳。
*警告:技术娴熟的攻击可能会使连接高举,以便对example.com/api/timestamp的任何调用都来自他们设置的不同机器,这会返回他们想要的时间,从而使手机出错时间作为起点。有一些方法可以防止这种情况(混淆,将其与其他数据配对,加密),但这很快就成为一个非常开放的问题,所以最好在其他地方提出。上述和监视器的组合可能是最好的事情。
答案 1 :(得分:2)
似乎没有办法完成你所要求的。似乎没有办法阻止用户改变时间。但除此之外,即使你可以阻止他们改变时间,他们也可以让他们的设备电池耗尽,然后将其插入并在没有网络连接的地方打开,他们的时钟将是错误的,直到它有有机会通过网络设置自己。因此,即使阻止他们改变时间也不能保证准确性。
您可以做的是需要网络连接来记录值,以便您可以验证服务器上的时间。如果你必须允许它在没有网络连接的情况下工作,你至少可以记录应用程序启动时的当前时间,并注意时间是否似乎倒退。如果时间戳突然早于上一个时间戳,你就会知道出现了什么。您也可以仅在他们尝试记录值时进行此检查。如果他们记录的时间戳早于任何先前记录的值,您可以拒绝它,或记录该事件,以便以后可以询问该人。
这也是其中一种情况,你可能只需要相信用户不要这样做,因为似乎没有一个完美的解决方案。
答案 2 :(得分:2)
首先要注意的是,用户始终可以将消息伪造到您的服务器,以便创建不正确的记录。
但是你可以使用一些有用的东西来至少注意到问题。大多数时候,确保这种系统安全的最佳方法是专注于检测,然后公开谴责那些不顾一切地规避政策的人。强锁是没有意义的,除非有一个警察最终会出现并阻止你。
当然,你应该首先假设任何时候错误都是偶然的。但只是公开“注意到”某人的设备似乎“行为不端”通常足以让不良行为消失。
那你能做什么?首先要注意它们出现在服务器上时的时间戳。时间戳应始终及时前进。因此,如果您已经在周一看到设备上的记录,则不应该在以后收到上周日的记录。您的应用也应如此。您可以跟踪在NSUserDefaults中终止的时间(以及将此信息发布到服务器)。你通常不应该在过去醒来。如果您这样做,请向您的服务器投诉。
关注UIApplicationSignificantTimeChangeNotification
。如果手动更改时间,我相信你会收到它(你会在其他几个案例中收到它,其中大多数都是良性的)。注意时间显着向后移动。抱怨你的服务器。
注意mach_absolute_time()
。这是自设备启动以来的时间,用户无法在没有越狱的情况下进行其他修改。它可用于区分重新启动和其他事件。它是在一个奇怪的时间单位,但它可以转换为人类时间,如QA1398中所述。如果马赫时间差超过挂钟时间一个小时,则有些奇怪(DST变化可能导致1小时)。抱怨你的服务器。
所有这些都可能是良性的。人类需要调查并做出决定。
如果涉及专门且熟练的攻击者,这些事情都不会确保您的记录正确无误。正如我所说的那样,专业且技术娴熟的攻击者可以向您发送虚假消息。但是这些事情,加上监控和纪律处分,使得内部人员甚至不知道如何打败系统是危险的。
答案 3 :(得分:0)
您无法阻止用户更改时间
即使是位置的时间由Apple调整,而不是真正的GPS时间。
你可以查看马赫内核时间,这是一个相对时间
将其与最后一次网络连接的时间进行比较。
但这一切听起来都不可靠。