Android 身份认证基本概念

2023-05-16

身份验证

Android 采用通过用户身份验证把关的加密密钥机制,该机制需要以下组件:

  • 加密密钥存储和服务提供程序。存储加密密钥并基于这些密钥提供标准加密例程。Android 支持由硬件支持的密钥库和 Keymaster 这两种加密服务,其中包括由硬件支持的密钥存储加密服务,该服务可能包括可信执行环境 (TEE) 或安全元件 (SE),例如 Strongbox。
  • 用户身份验证程序。证明相应用户存在并/或已成功通过身份验证。Android 支持 Gatekeeper(用于 PIN 码/解锁图案/密码身份验证)和 Fingerprint(用于指纹识别身份验证)。搭载 Android 9 及更高版本的设备可以使用 BiometricPrompt 作为指纹和其他生物识别技术的单一集成点。这些组件通过已经过身份验证的渠道与 Keystore 服务沟通身份验证状态。(Keystore 服务还支持框架级 Android Keystore 系统。)

Gatekeeper、Fingerprint 和 Biometric 组件能够与 Keystore 及其他组件协同运作,以支持使用由硬件支持的身份验证令牌 (AuthToken)。

注册

在设备恢复出厂设置后首次启动时,所有身份验证程序均会做好接受用户通过凭据注册的准备。用户必须先通过 Gatekeeper 注册一个 PIN 码/解锁图案/密码。该首次注册会随机生成一个 64 位的用户安全标识符 (SID),该用户 SID 将用作用户的标识符以及用户加密材料的绑定令牌。该用户 SID 会以加密形式绑定到用户的密码,成功通过 Gatekeeper 的身份验证后,会相应生成 AuthToken,其中包含用于该密码的用户 SID。

用户如果想要更改凭据,则必须提供现有凭据。如果现有凭据成功通过验证,则与现有凭据关联的用户 SID 将转移到新凭据,这样用户便可以在更改凭据后保留访问密钥。如果用户未提供现有凭据,系统会使用一个完全随机的用户 SID 为其注册一个新凭据。用户可以访问设备,但会永久丢失基于旧用户 SID 创建的密钥。这种情况称为“不可信注册”。

一般情况下,Android 框架不允许进行不可信注册,因此大多数用户根本看不到该功能。不过,如果设备管理员或攻击者强制重置密码,则可能会发生这种情况。

身份验证

用户设置凭据并收到用户 SID 后,便可以开始进行身份验证,身份验证从用户提供 PIN 码、解锁图案、密码或指纹开始。所有 TEE 组件都共用一个密钥来验证对方的消息。

 

图 1.身份验证流程

  1. 用户提供身份验证方法,然后关联的服务向关联的守护程序发出请求。
    • 对于 PIN 码、解锁图案或密码,LockSettingsService 会向 gatekeeperd 发出请求。
    • 基于生物识别技术的身份验证流程取决于 Android 版本。在搭载 Android 8.x 及更低版本的设备上,FingerprintService 会向 fingerprintd 发出请求。在搭载 Android 9 及更高版本的设备上,BiometricPrompt 会使用合适的 BiometricManager 类(如 FingerprintManagerFaceManager)向相应的生物识别守护进程发出请求(例如,若是指纹识别身份验证,则向 fingerprintd 发出请求;若是人脸识别身份验证,则向 faced 发出请求)。无论什么版本,生物识别身份验证都会在请求发出后异步进行。
  2. 守护进程将数据发至其副本,后者生成 AuthToken:
    • 对于 PIN 码/解锁图案/密码身份验证,gatekeeperd 将 PIN 码、解锁图案或密码哈希发送到 TEE 中的 Gatekeeper。如果 TEE 中的身份验证成功,TEE 中的 Gatekeeper 会将包含相应用户 SID(已使用 AuthToken HMAC 密钥签名)的 AuthToken 发送到它在 Android 操作系统中的副本。
    • 对于指纹识别身份验证,fingerprintd 会监听指纹事件并将数据发送到 TEE 中的 Fingerprint。如果 TEE 中的身份验证成功,TEE 中的 Fingerprint 会将 AuthToken(已使用 AuthToken HMAC 密钥签名)发送到它在 Android 操作系统中的副本。
    • 对于其他生物识别身份验证,相应的生物识别守护进程会监听生物识别事件,并将其发送到相应的生物识别 TEE 组件。
  3. 守护进程收到经过签名的 AuthToken,并通过 Keystore 服务 Binder 接口的扩展程序将 AuthToken 传递给 Keystore 服务。(gatekeeperd 还会在设备被重新锁定以及设备密码发生变化时通知 Keystore 服务。)
  4. Keystore 服务将 AuthToken 传递给 Keymaster,并使用与 Gatekeeper 和支持的生物识别 TEE 组件共用的密钥来验证这些 AuthToken。Keymaster 会将令牌中的时间戳视为最后一次身份验证的时间,并根据该时间戳做出密钥发布决定(以允许应用使用相应密钥)。

注意:设备重新启动后,AuthToken 即作废。

AuthToken 格式

为了确保在各种语言和组件之间实现令牌的共用和兼容,hw_auth_token.h 中规定了 AuthToken 的格式。 该格式是一个简单序列化协议,具有以下固定大小的字段。

字段类型必需说明
AuthToken 版本1 个字节下方所有字段的组代码。
质询64 位未签名整数用于防范重播攻击的随机整数,通常是所请求的加密操作的 ID。目前由交易指纹授权使用。如果质询存在,AuthToken 将仅对包含该相同质询的加密操作有效。
用户 SID64 位未签名整数不重复的用户标识符,以加密形式绑定到与设备身份验证关联的所有密钥。如需了解详情,请参阅 Gatekeeper。
身份验证程序 ID (ASID)64 位未签名整数,按网络字节序保存绑定到特定身份验证程序政策时使用的标识符。所有身份验证程序都有自己的 ASID 值,它们可以根据自己的要求更改该值。
身份验证程序类型32 位未签名整数,按网络字节序保存
  • 0x00 代表 Gatekeeper。
  • 0x01 代表 Fingerprint。
时间戳64 位未签名整数,按网络字节序保存自最近一次系统启动以来已经过的时间(以毫秒为单位)。
AuthToken HMAC (SHA-256)256 位 Blob除 HMAC 字段以外所有字段的已加密 SHA-256 MAC。

设备启动流程

每次设备启动时,都必须生成 AuthToken HMAC 密钥并由所有 TEE 组件(Gatekeeper、Keymaster 以及支持的生物识别 Trustlet)共用该密钥。因此,为了加强对重播攻击的防范力度,每次设备重新启动时都必须随机生成 HMAC 密钥。

关于与所有组件共用此 HMAC 密钥的协议是一项依赖于平台的实现功能。在任何情况下都不能将该密钥设为在 TEE 之外可用。如果 TEE 操作系统缺少内部进程间通信 (IPC) 机制,需要通过不可信操作系统传输数据,那么传输操作必须通过安全的密钥交换协议进行。

与 Android 并排运行的 Trusty 操作系统就是一种 TEE,不过也可以使用其他 TEE。Trusty 使用内部 IPC 机制在 Keymaster 和 Gatekeeper 或相应的生物识别 Trustlet 之间直接进行通信。HMAC 密钥只保存在 Keymaster 中,Fingerprint 和 Gatekeeper 会在每次使用时向 Keymaster 请求该密钥,而不会保留或缓存该密钥的值。

由于一些 TEE 缺少 IPC 基础架构,因此 TEE 中的小程序之间不会进行通信。这还使得 Keystore 服务因知晓系统中的身份验证表而能够快速拒绝注定会失败的请求,从而避免向 TEE 发送可能会占用大量资源的 IPC。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 身份认证基本概念 的相关文章

  • onActivityResult 中的完成活动不起作用

    我有一对必须同生共死的活动 基本上 AlphaActivity 会做一些工作 然后发送一个意图 startActivityForResult 对于 Beta 活动 当 Beta 活动完成时 我希望它发送一个意图 startActivity
  • Espresso - 检查使用按钮按下意图打开哪个活动?

    是否可以跟踪按下某个按钮后打开了哪个 Activity 我有一个测试 其中当单击 按下按钮时 it 向服务器发送请求 直到发送请求时 它打开一个活动 验证是否执行成功在测试中 我需要检查打开的 Activity 是什么 我的测试示例 检查
  • 如何改变android中menuItem的背景颜色?

    我正在以编程方式将菜单项添加到菜单中 我想在选择特定项目时添加背景颜色 如何为 menuItem 添加背景 您的回答将不胜感激 虽然其他答案提供了更改样式 这会影响all菜单项 据我了解 需要更改一个菜单项 我建议你使用android ac
  • doInBackground 运行时是否可以停止 asynctask?

    我正在 ActivityB Oncreate 中创建异步任务 在该任务中 我正在运行无限 while 循环doInBackground 当我转到上一个活动并再次回到该活动时 创建了另一个异步任务 我的问题现在是两个无限 while 循环正在
  • 启动 Twitter 应用程序 [重复]

    这个问题在这里已经有答案了 可能的重复 Twitter 应用程序的 Android Intent https stackoverflow com questions 2077008 android intent for twitter ap
  • 如何从另一个xml文件动态更新xml文件?

    我想从另一个 xml 文件更新 xml 文件 我使用了一个 xml 文件 如下所示 one xml
  • 无法解析符号 FlutterActivity

    我使用 VCS gt Checkout from Version Control 将 flutter 项目从 github 导入到 Android Studio 中 现在我面临的问题是 Cannot resolve symbol Flutt
  • 在 Android 2.2 上运行 HelloCordova 时找不到类“android.webkit.WebResourceResponse”

    我尝试按照本教程进行操作 http docs phonegap com en 2 7 0 guide getting started android index md html Getting 20 Started 20with 20 An
  • Google Inbox 类似 RecyclerView 项目打开动画

    目前 我正在尝试实现 Google Inbox 例如RecyclerView行为 我对电子邮件打开动画很好奇 我的问题是 该怎么做 我的意思是 他们使用了哪种方法 他们用过吗ItemAnimator dispatchChangeStarti
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • layout.xml 的用途是什么?

    人们为什么使用layout xml在他们的resources like
  • 如何在 Android 清单文件中设置文本外观?

    是否可以做相当于 setTextAppearance context android R style TextAppearance Medium 在 Android 应用程序的清单文件中 android textAppearance and
  • 如何从SurfaceView绘制到Canvas?

    我正在尝试做简单的画家 问题是Android看起来有三个独立的Canvas并给我它来顺序绘制 我用以下方式制作了用户界面SurfaceView 把霍尔德从中拿走 Override protected void onCreate Bundle
  • 如何在 WebView 中添加 JavaScript 函数并稍后在提交 reCAPTCHA 时从 HTML 调用它

    我在 WebView 中添加一个 JavaScript 函数 如下所示 Kotlin val webView findViewById R id webview as WebView webView getSettings setJavaS
  • 无法在 Android 模拟器中安装 apk

    我正在尝试通过 adb shell 在 ICS 模拟器中安装 apk 从一个站点下载 但出现以下错误 失败 INSTALL FAILED UID CHANGED 可能是什么问题 只需 rm r 有问题的数据目录即可 如果您在安装时遇到此错误
  • Android:如何使视图增长以填充可用空间?

    这看起来很简单 但我不知道该怎么做 我有一个带有 EditText 和两个 ImageButtons 的水平布局 我希望 ImageButtons 具有固定大小 并且 EditText 占据布局中的剩余空间 如何才能做到这一点
  • 如何在新标签 android webview 中打开链接? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经使用 webview 创建了一个 android 应用程序来显示我的网站 我什至想添加在新选项卡中打开链接的功能 但我找不到任何
  • Android:单一活动,多个视图

    我不是 Android 专业人士 尽管我开发了一个包含 50 多个活动的应用程序 这使得该应用程序非常庞大 经过8周的开发 现在出现了一些问题 导致应用程序难以维护和升级 我正在处理的主要问题是 我无法将对象引用传递给活动的构造函数 事实上
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • Android:获取最新意图

    如何获取发送到活动的最后一个意图 的文档onNewIntent 建议我需要做这样的事情 class MyActivity public void onNewIntent Intent intent setIntent intent reac

随机推荐

  • 利用STM32的HAL库驱动1.54寸 TFT屏(240*240 ST7789V)

    项目 xff1a 温湿度表 芯片 xff1a STM32F030C6T8 液晶 华迪1 54寸 TFT屏 温湿度传感器 xff1a SHT30 主要对液晶屏官方驱动代码进行了增加和修改 一 STM32CubeMX建立工程 I2C1 给SHT
  • 数组中删数

    题目描述 在给定的数组中删除一个数 输入 多组测试 xff0c 每组第一行输入1个整数n xff08 n lt 20 然后是n个整数 第二行输入1个整数m 输出 删除在第一行的n个整数中第一次出现数字m并删除 xff0c 然后按照顺序输出剩
  • 做程序媛这几年,感受?体验?

    首先 感受 和男程序员一个样 真不是废话 BUG是修不完的 但是不能放过它 因为你的内心会遭受煎熬 直接进入体验 就不用重复的文字去啰嗦了 直接上图哈 以下的这几种情况 在我的生活中 是真的不断出现 连样式都没变过 first 修电脑AND
  • 算法题:求从n个数组任意选取一个元素的所有组合

    http www cnblogs com shuaiwhu archive 2011 06 15 2081552 html http download csdn net detail gz434933205 8728787
  • Java高级特性泛型看这一篇就够了

    泛型在我们工作中用到的很多 xff0c 但是很多同学其实对泛型不怎么了解 xff0c 包括我 xff0c 所以我们来一起学习一下泛型 xff0c 主要是从以下几点来介绍一下泛型为什么需要泛型 泛型类和泛型接口的定义 xff0c 泛型方法的辨
  • 基于链表的内存池算法

    include 34 head h 34 define INITPOOL 5000 每个的内存池的初始大小 define ADDPOOL 5000 每个新增的内存池的初始大小 define Byte 44 每个新分配内存字节数 typede
  • ubuntu linux下开启远程唤醒

    目录 启动远程唤醒 xff0c 需要主板支持才能进行 步骤一 xff1a 检查计算机硬件是否支持WOL wake on lan 功能 步骤二 xff1a 检查主板和电源是否支持WOL 步骤三 xff1a 检查网卡是否支持WOL 步骤四 xf
  • Depends:xxx but it is not going to be installed

    最近在Ubuntu16 04上编译opencv xff0c 但从最开始就遇到了头大的问题 xff0c 在下载安装依赖项时遇到Depends xff1a xxx but it is not going to be installed xff0
  • 打开计算机的管理需要在控制面板中创建关联

    今天在工作中发现当我选择计算机 管理时提示我需要在控制面板中创建关联 xff0c 如下图所示 xff1a 于是 xff0c 我便上百度搜索了一下 xff0c 答案是这样的 xff1a 修改 span style font family no
  • ftp身份认证时登录框反复弹出以及ftp常用配置

    1 若我们想访问一个人的ftp站点 xff0c 直接通过浏览器直接访问就可以了 xff08 ftp 要访问主机A的IP地址 xff09 如果对方开启了基本身份认证的话 xff0c 我们就需要输入正确的用户名及密码才可正常访问 xff0c 即
  • Linux下挂载U盘、ISO、光盘、rpm

    1 挂载U盘 1 xff09 将U盘连接到虚拟机后 xff0c 使用fdisk l xff08 注意 xff0c 这是list单词的首字母l xff09 命令查看当前U盘的设备符号 2 xff09 创建目录 mnt usb xff0c 以备
  • unity 3D学习日记:创建一个小场景并编写简单C#移动脚本

    学习Unity 3D第一周 xff0c 完成的目标一是创建一个小场景 xff0c 用角色控制器在场景里行走 xff1b 二是编写一个简单的移动脚本 一 创建一个小场景 xff0c 用角色控制器在场景里行走 1 先安装Unity 3D 5 3
  • 基于Unity3D平台的三维虚拟城市研究与应用

    0 引 言 随着现代城市的不断拓展延伸 城市空间多层次 立体模式管理逐渐成为城市规划管理的发展趋势 1 实现城市空间信息管理模式从二维到三维的转变 三维虚拟城市技术 已经成为人们关注和研究的热点 2 三维虚拟系统具有多维信息处理 表达和分析
  • unity:C#控制人在真实环境中行走

    自己在学习unity的课程中遇到了 xff0c 有的地方还没怎么太理解上去 xff0c 先做个笔记 xff0c 顺便看看有没有需要的人 1 搭建一个小场景 xff0c 一个需要控制的 人 xff08 添加CharacterControlle
  • unity 3D:自动寻路

    首先 xff0c 搭建一下场景 xff0c 场景要求 xff1a 有遮挡 xff0c 设置好不可走区域为navigation static 以及 not walkable 在人身上添加Nav Mesh Agent 设置好后勾选显示导航网格
  • Java高级特性反射与动态代理模式

    文章目录 前言一 了解反射二 继续了解反射 xff08 哈哈哈 xff09 1 每一个类对应的class放在哪里 xff1f 2 这个class里面都保存了什么3 如何使用 xff1f 3 1 获取类加载器3 2 获取构造器对象3 3 获取
  • Unity3D 使用SceneManager跳转/加载场景

    很久没有更新博客了 xff0c 最近也是还在学习U3D 下面写一下使用SceneManager跳转 加载场景 我们假设要点击一个按钮跳转 xff0c 那么我们只要把跳转的代码写进按钮点击事件里就好了 其实加载场景很简单 xff0c 只需要写
  • Hisat2 Bowtie2比对结果解读

    Bowtie的中文意思是 xff1a 领结 xff0c 蝴蝶结 Bowtie2用户手册 xff1a http bowtie bio sourceforge net bowtie2 manual shtml 在看比对结果前需要了解三个概念 x
  • React 项目启动报错:The “path” argument must be of type string

    今天下载一个旧的React项目 xff0c yarn start 运行 xff0c 报错 xff1a TypeError ERR INVALID ARG TYPE The path argument must be of type stri
  • Android 身份认证基本概念

    身份验证 Android 采用通过用户身份验证把关的加密密钥机制 xff0c 该机制需要以下组件 xff1a 加密密钥存储和服务提供程序 存储加密密钥并基于这些密钥提供标准加密例程 Android 支持由硬件支持的密钥库和 Keymaste