之前做了一个应用内手势密码设置与验证的功能模块,虽然不是Android系统的锁屏,但大致原理都是一样的。
自己实现
我在自己实现这个锁屏时,在设置手势密码时,滑动后得到了滑动连接的几个点,然后根据这几点的位置,0,3,6,7等等,得到”0367”这样的字符串,然后存储在shared中,在验证时根据用户滑动的数据生成再进行对比。
以上思路是没有问题的,但在安全上是有隐患的,属于对敏感数据的明文存储
在获取Root权限的手机,直接读取data/user/0/app包名/shared_prefs/中的XML文件就能得到密码,略一分析就知道密码是多少了。
在未获取Root权限的手机,app如果未关闭备份选项的话,可以通过adb得到数据备份包,里面就包括SharedPreferences的数据,简单逆向后就能得到数据。
学习
在学习《Android应用安全防护和逆向分析》这本书的第一章时,发现其中的安全思想是我没有考虑到的。
第一章是分析Android源码中的锁屏源码
锁屏密码的存储是通过计算(明文密码+设备salt值)的MD5和SHA1操作,然后转化为hex值拼接后存储为一个.key文件