Android M 之前锁屏密码的存储

在 Android M 之前,锁屏密码的存储格式很简单,其使用了 64 位随机数作为 salt 值,此 salt 值被存储在 sqlite 数据库 /data/system/locksettings.db 中。密码在存储的时候,会将输入的密码加上此随机数组成新的字符串。然后对新的字符串分别进行 SHA-1 和 MD5 加密,将加密后的密文通过 MD5 + SHA-1 的方式进行字符串拼接,组成新的密文存储在 /data/system/password.key 中,共有 72 位。其加密后的形式如下:

/data/system # cat password.keyB40C2F6FE4E89F3386D4E689B135304410D64951914FB35770FDAC58B694177B29297A80

而密码的详细信息,存储在 /data/system/device_policies.xml 中,内容类似如下:

/data/system # cat device_policies.xml

其中主要用到的两个字段 quality 是密码的类型,简单密码和复杂密码的值不同,length 是密码的长度,其他字段存储密码中各种字符的数量。

Android M 中锁屏密码的存储

在 Android M 中,锁屏密码的存储格式发生了变化,其默认的存储格式在/system/gatekeeper/include/gatekeeper/password_handle.h 中描述如下:

typedef uint64_t secure_id_t;typedef uint64_t salt_t;/** * structure for easy serialization * and deserialization of password handles. */static const uint8_t HANDLE_VERSION = 2;struct __attribute__ ((__packed__)) password_handle_t { // fields included in signature uint8_t version; secure_id_t user_id; uint64_t flags; // fields not included in signature salt_t salt; uint8_t signature[32]; bool hardware_backed;};

其中 version 默认是 2,user_id 是 Android 用户 id ,signature 存储的便是密文,hardware_backed 存储的是加密方式,0 表示密文是软件加密,而 1 表示密文是通过 TEE 环境进行加密得到的。

密码加密后默认以 password_handle_t 格式存储在/data/system/gatekeeper.password.key 中。密码的生成和校验,在 HAL 层是通过 system/core/gatekeeperd/gatekeeperd.cpp 中的函数实现的。其在系统启动时被注册为 gatekeeperd 服务,服务在启动的时候会调用 GateKeeperProxy()对象,此类的构造函数会去查找 TEE module,如果找到,则通过 TEE 设备进行加解密,如果没有找到,则通过一个软件设备进行加解密。

这里主要分析下通过软甲设备解密的逻辑。解密时,会调用到system/core/gatekeeperd/gatekeeperd.cpp 中的以下函数:

int verify(uint32_t uid,const uint8_t *enrolled_password_handle,uint32_t enrolled_password_handle_length,const uint8_t *provided_password,uint32_t provided_password_length,bool *request_reenroll)

在此函数中,由于没有使用 TEE,所以会调用到软件设备验证 system/core/gatekeeperd/SoftGateKeeperDevice.cpp 中的:

int SoftGateKeeperDevice::verify(uint32_t uid,uint64_t challenge,uint8_t **auth_token,uint32_t *auth_token_length,bool *request_reenroll)

函数进行校验,此函数对传进来的信息进行处理后交到system/gatekeeper/gatekeeper.cpp 中的

void GateKeeper::Verify(const VerifyRequest &request,VerifyResponse *response)

进行处理,在这里对参数进行一系列处理和重新组织后再交给

bool GateKeeper::DoVerify(const password_handle_t *expected_handle,const SizedBuffer &password)

进行校验,在此函数中,再调用

bool GateKeeper::CreatePasswordHandle(SizedBuffer *password_handle_buffer,salt_t salt,secure_id_t user_id,uint64_t flags,uint8_t handle_version,const uint8_t *password,uint32_t password_length)

将上面提到的 /data/system/gatekeeper.password.key

文件中存储的信息进行解析,然后调用

ComputePasswordSignature(password_handle->signature,sizeof(password_handle->signature),password_key,password_key_length,to_sign,sizeof(to_sign),salt);

函数将输入的密码进行加密,从这里可以看到,输入的密码要加密成密文只需要用到存储的密码中的 salt 值,此函数在system/core/gatekeeperd/SoftGateKeeper.h 中,其调用 crypto 库中的

crypto_scrypt(password,password_length,reinterpret_cast(&salt),sizeof(salt),N,r,p,signature,signature_length);

将输入的密码存储在 signature 中并返回。此函数最终会通过 SHA256 进行加密,参数中的 N,p 默认为如下值:

static const uint64_t N = 16384;static const uint32_t r = 8;static const uint32_t p = 1;

通过以上处理后对输入的密码加密后得到的密文与手机中存储的密文进行比较后返回校验结果,从而判断输入的密码的正确与否。

在 Android M 中,改变了之前直接在 Java 层进行密码校验的方式,将密码的校验通过 HAL 层的服务进行处理,同时加入对 TEE 的支持,使得锁屏密码的安全性大大提升,同时也可以方便的支持其他的安全特性,提升了整个系统的安全性。

以上这篇深入理解Android M 锁屏密码存储方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程小技巧。

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

android锁屏密码文件夹,深入理解Android M 锁屏密码存储方式相关推荐

  1. 给计算机图片文件夹加密码,文件夹怎么设置密码

    文件夹怎么设置密码,如何给文件夹设置密码?有些重要的文件或比较隐私的文件存放在电脑上,这些文件我们只希望自己能看到并使用,不希望别人访问.那么,最好的办法就是去对这些文件进行加密. 才不怕别人看到自己 ...

  2. android studio assets 添加,Android studio 添加assets文件夹的方法

    Android studio 添加assets文件夹的方法 我们知道Eclipse创建的工程默认是有个assets文件夹的,但是Android studio默认没有帮我们创建,那么我们就自己创建一个就 ...

  3. 网络文件夹目前是以其他用户名和密码进行映射的 解决方案

    当映射网络驱动器到文件服务器时,发现有些文件夹可以被映射,有些文件夹却不能被映射. 在输入了用户名和密码后弹出以下错误信息:"指定的网络文件夹目前是以其他用户名和密码进行映射的.要用其他用户 ...

  4. android 创建隐藏文件夹吗,Android创建隐藏文件可能文件夹

    Android创建隐藏文件或者文件夹 android创建隐藏文件或者文件夹,其实只要在文件名或者文件夹名字前加一个点号即可. 隐藏文件(夹)可直接进行读写. 如果需要去除隐藏,那就是重命名,去除点即可 ...

  5. android 7 创建文件夹,Android 在 res/layout 文件夹 下创建一个 子文件夹实例

    Android 资源文件夹 Layout 文件夹 Layout 文件是存放Android的布局文件的资源文件夹,但是如果你想要在里面创建子文件夹,你会发现xml文件报错. 如何在Layout文件夹下方 ...

  6. Android各国语言Values文件夹命名规则

    android多国语言文件夹文件汇总如下: 维吾尔文(中国):values-ug-rCN 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港):values ...

  7. android studio在raw文件夹下使用MediaPlayer播放Mp3音乐

    android studio在raw文件夹下使用MediaPlayer播放Mp3音乐 1.在res文件夹下创建raw文件夹 2.在新建好文件夹之后,将MP3文件拖入进刚刚创建好的raw文件夹内 3.使 ...

  8. android studio各个资源文件夹以及作用备注

    src:存放所有的*.java源程序. gen:为ADT插件自动生成的代码文件保存路径,里面的R.java将保存所有的资源ID. assets:可以存放项目一些较大的资源文件,例如:图片.音乐.字体等 ...

  9. 指定的网络文件夹目前是以其他用户名和密码进行映射的。要用其他用户名和密码进行连接,首先请断开所有现有的连接到网络共享的映射...

    什么情况?我是win7 32 系统,对方是xp64 . 解决办法: 当映射网络驱动器到文件服务器时,发现有些文件夹可以被映射,有些文件夹却不能被映射. 在输入了用户名和密码后弹出以下错误信息:&quo ...

最新文章

  1. 四月青少年编程组队学习(Python一级)Task01
  2. 索赔 100 万!只是因为一个开源插件?
  3. [LeetCode]: 62: Unique Paths
  4. (Spring程序开发)简介程序开发步骤配置文件相关API
  5. Spring RESTful错误处理
  6. UNIX(多线程):27---多线程并发之原子操作与无锁编程
  7. SpringMvc 注解 @InitBinder 表单多对象精准绑定接收
  8. 如何通过大华sdk采集一帧图像?_EasyData解放数据标注员双手,采集清洗标注一站搞定...
  9. LightOJ1234 Harmonic Number
  10. mfc界面的onvscroll没反应_电脑小技巧之360安全卫士卸载不掉怎么办?只因一个开关没打开...
  11. cmd合并多个ts文件,ffmpeg快速转ts为mp4文件,通过m3u8合并文件
  12. redis——相关问题汇总
  13. 电压电流测量模块在matlab,MATLAB仿真时用simulink的RMS模块测量电压有效值,总提示如下警告,怎么破,跪求?...
  14. 芯片技术---芯片到底是什么?
  15. vue 组件通信合集
  16. python量化分析
  17. python 进程池pool使用详解
  18. 一页纸商业计划书模板(转载)
  19. 离散数学 第六章 函数
  20. RT-Thread Studio ulog日志

热门文章

  1. 【无标题】HTMLCSS学习总结
  2. 软件测试环境的搭建及详解
  3. 显著性目标检测之Shifting More Attention to Video Salient Object Detection
  4. 记录一次Spring提供的定时任务
  5. Contest2257 - 抗击疫情,从我做起--大中小学生联合训练赛第五十二场
  6. 哈工大ltp词性标注列表和ICTCLAS词性列表
  7. 星际争霸 2 快捷键
  8. 自动透视校正为四边形对象
  9. 在wps里面怎么设置触发器_wps如何制作触发器
  10. Vue插件element-ui安装时报错error An unexpected error occurred: “https://registry.npmjs.org/element-ui: conn