1、密码存放在的位置
Android 中的锁屏密码是存储在系统文件的数据库中的。
android 5.0 下 数据库存放在(android 8.0 小米系统已经不是这个目录了)
/data/system/locksetting.db
当系统在校验用户输入的密码时,是从这个位置拿到的。
2、密码的加密方式
数字密码 一般只让设置 4 位,为了保证手机的安全,android 系统对用户的设定做了这样的加密方式:
- 首先从系统中拿到要 加密需要的 salt,有了这个salt 就能够增大破解密码的难度。
- 将用户设定的密码 + 第一步拿到的 salt 值,分别进行 sha-1 和 md5 的操作
- 将上方的 sha-1 和 md5 分别转成 hex 值之后,在此拼接,得到的就是最终保存到数据库真实的密码。
3、怎么拿到 salt 呢?
android 本身的系统当然能够很轻松的拿到 salt,但是如果自己想去拿的话,有两种方式
-
salt 其实也是存储在 系统的数据库中的,所以直接去拿,是可以的
-
通过反射的方式去拿,反射的方法可以参考如下代码
try{ Class<?> clazz1=Class.forName("com.android.internal.widget.LockPatternUtils"); Object lockUtils=clazz1.getConstructor(Context.class).newInstance(this); Class<?> lockUtilsClazz=lockUtils.getClass(); Method getSaltM=lockUtilsClazz.getDeclareMethod("getSalt",int.class); Object saltObj=getSaltM.invoke(lockUtils,0); log.i("guaju","salt:"+saltObj); } catch(Exception e){ Log.i("guaju","err"+Log.getStackTraceString(e)); }
这个拿到的 salt 值,就是在数据中拿到 salt (数据库中时 long类型)转成 hex之后的值。