Android 登录锁定机制:基于设备运行时间的可靠实现

一、问题背景

在开发需要账号密码登录的Android应用时,我们通常需要实现以下安全策略:

“连续输错密码5次后锁定账号10分钟,期间提示用户稍后重试。锁定状态在成功登录或设备重启后自动解除。”

传统方案的缺陷

早期实现可能直接依赖 System.currentTimeMillis() 记录锁定时间,但这种方式存在严重问题:

  • 用户手动修改系统时间可绕过锁定机制
  • 设备重启后无法准确判断是否应解除锁定

二、解决方案设计

核心思路

  1. 基于设备运行时间
    • 使用 SystemClock.elapsedRealtime()(从系统启动开始累计的毫秒数,不受用户修改时间影响)
  2. 可靠的重启检测
    • 比较两次记录的设备运行时间,若当前值小于上次记录值,则判定为设备已重启
  3. 状态持久化
    • 通过 SharedPreferences 存储错误次数和锁定截止时间

三、完整 Kotlin 实现

1. 定义常量

// Constants.kt
object LockConfig {
   
    const val PREF_NAME = "account_lock_prefs"
    const val KEY_ERROR_COUNT = "error_count"
    const val KEY_LOCK_UNTIL = "lock_until"      // 锁定截止时间(基于elapsedRealtime)
    const val KEY_LAST_ELAPSED = "last_elapsed"  // 上次设备运行时间
    const val MAX_ATTEMPTS = 5
    const val LOCK_DURATION_MS = 10 * 60 * 1000L // 10分钟(毫秒)
}

2. 设备重启检测

LoginActivityonCreate 中初始化:

class LoginActivity : AppCompatActivity() {
   
    private val prefs by lazy {
    
        getSharedPreferences(LockConfig.PREF_NAME, MODE_PRIVATE) 
    }

    override fun onCreate(savedInstanceState: Bundle?) {
   
        super.onCreate(savedInstanceState)
        detectSystemReboot()
    }

    /** 检测设备是否重启并重置状态 */
    private fun detectSystemReboot() {
   
        val currentElapsed = SystemClock.elapsedRealtime()
        val lastElapsed = prefs.getLong(KEY_LAST_ELAPSED, 0L)

        // 当前时间小于上次记录时间 = 设备已重启
        if (currentElapsed < lastElapsed
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值