美文网首页
防止Android用户篡改手机时间

防止Android用户篡改手机时间

作者: 曾经的你呀 | 来源:发表于2017-10-30 11:25 被阅读168次

    本文地址:http://www.jianshu.com/p/47d4944196d2 [FBI WARMING]

    背景

    项目的打卡模块要求服务器挂了,网络不好但能定位的时候也能打卡,打卡时间客户端确定,先缓存本地,有网络后上传服务器,就是打卡时间是要客户端确定的。那么问题就来了,有个小伙伴把手机调后半个小时切了网络后提前下班了

    一种防止Android 篡改手机时间的方法

    大概是想就是在某个一个时刻获取服务器时间,记录此时 服务器时间和距离开机的时间,someServerTime和someBootedTime。那么在某个时刻T 的真实时间就是先算出T 时刻和someBootedTime 的时间差SystemClock.elapsedRealtime()-someBootedTime;也就是:

    long period = SystemClock.elapsedRealtime() -someBootedTime;
    long nowTime= someServerTime + period;

    关于SystemClock.elapsedRealtime()

    它是系统启动到当前时刻经过的时间,包括了系统睡眠经过的时间。现在大部分的手机都有重启和关机,那么重启和关机后获取的SystemClock.elapsedRealtime() 有什么不同呢?当然有的

    简单来说,手机开关机和电脑类似,是对硬件的状态进行检测,关机时系统和硬件全部关闭。再开机则再次检测所有硬件情况,然后重新加载所有数据。

    而重启是手机软件层面的重新启动,并不涉及硬件,它会使系统自动跳过开关机时需要执行的很多步骤,直接进入操作系统。

    Android 手机一般都有关机和重启的选项,iphone 其实也有,重启 长安电源和Home 按键大于10秒就是强制重启(这个重启和Android 的重启是不是一个东西就不知道了)

    所以SystemClock.elapsedRealtime() 在两种情况的区别就不言而喻了!

    不知道有没有遇到SystemClock.elapsedRealtime() 跑久了不准确的情况?

    还会遇到的问题

    因为这种方法还是有一联网校准的过程,所以还是有一个缺陷,那就是要验证手机重启后是否完成校准。我们要保证有网状态下重启时间精确校准;重启后打卡的时候发现时间没有校准再校准一次基本就无问题了。

    More ,没有GPS不开Wi-Fi也可能被高精度定位

    多说一句看下面的图我相信大家会相信没有GPS,不开Wi-Fi也可能被高精度定位的,我们的打卡就算没开GPS权限,不连接Wi-Fi也能高精度定位,上传了电话基站的ID。所以某些情况下Android 手机的位置隐私是不容易隐藏的,手机基站ID 都能拿到,iOS好像拿不到

    没GPS,没有Wi-Fi被高精度定位?.png

    需要代码?

    不要了吧,要的话给我买2杯咖啡

    相关文章

      网友评论

          本文标题:防止Android用户篡改手机时间

          本文链接:https://www.haomeiwen.com/subject/cqjppxtx.html