如何在Xamarin.Forms离线应用中校验Android与iOS系统日期时间是否正确
移动端系统时间篡改校验可行方案
方案1:基于可信时间源+开机时长计算可信时间
这是最常用的无后台依赖校验方案,核心逻辑是利用不受系统时间修改影响的开机时长参数做校准:
- 应用启动/切到前台时,向NTP服务器请求获取可信网络时间,同时记录两个值:当前拿到的可信时间戳、当前设备的开机时长(Android使用
SystemClock.elapsedRealtime(),iOS使用CACurrentMediaTime(),两个参数均只和设备开机时长挂钩,用户修改系统时间不会改变该值) - 后续业务需要获取时间时,不要直接调用
DateTime.Now,而是通过公式计算:可信时间 = 缓存的NTP时间 + (当前开机时长 - 记录NTP时间时的开机时长),该计算结果的误差可控制在1秒以内 - 网络不可用无法获取NTP时间时,可以限制签到、限时活动等对时间敏感的功能使用,或弹窗提示用户开启系统自动同步时间
方案2:服务端时间兜底校验
适合有后端服务的业务场景,从根源避免前端时间篡改问题:
- 所有涉及时间有效性判断的业务逻辑,全部放到服务端执行,前端仅展示服务端返回的时间,不做任何有效性校验
- 弱网场景下可以缓存上一次服务端返回的时间,和方案1的开机时长计算逻辑结合使用,等到下次联网时再同步最新的服务端时间做校准
方案3:篡改状态快速识别
可作为辅助校验逻辑,快速识别明显的篡改行为:
- Android端可以直接读取系统设置判断自动时间开关状态:调用
Settings.Global.getInt(getContentResolver(), Settings.Global.AUTO_TIME, 0),返回值为1则代表开启了网络同步时间,被篡改的概率极低 - 本地缓存上一次业务正常时的可信时间,如果当前调用
DateTime.Now拿到的时间早于缓存的可信时间,可直接判定为系统时间被篡改
推荐优先结合方案1和方案2使用,NTP时间同步可以直接调用系统内置的NTP客户端能力,不需要自己实现底层协议,性能开销极小。如果是对时间精准度要求极高的业务,务必将所有时间判断逻辑收敛到服务端。
内容的提问来源于stack exchange,提问作者Rajat Shirke
相关产品推荐
相关产品推荐

