Android手机可信引导解决方案

2023-10-26

1. 概述

 

        Android手机的可信引导过程,主要分为三部分,lk的可信,boot的可信,和system的可信;系统上电到lk的启动过程验证,因为和硬件联系紧密,基本都由各自硬件厂商完成.

        lk就是bootloader,它由Pre-loader 启动,该模块在android手机中只可由fastboot工具刷入设备,它的大小一般在1M以下,那么lk的可信就由Pre-loader定义,但是Pre-loader的可信有谁定义呢?为了让android手机有一个公认的可信根,综合考虑可移植性、开发难度、成本等因素,决定定制fastboot工具,android手机如果需要刷入bootloader、Pre-loader等模块,必须使用特制的fastboot工具,用户一旦使用该工具刷入lk模块,fastboot工具就对其进行摘要运算,并且将摘要值传递给远程服务器,服务器通过比较得出lk是否可信的结论,回传给fastboot工具,fastboot工具根据结论是否刷入lk;通过这个办法基本解决lk的可信。

        Boot分区包括了kernel、init、healthd等操作系统必须的文件,它由bootloader启动,该模块在android手机中可由fastboot、ota方式刷入设备,它的大小一般在30M以下,那么kernel的可信就由bootloader定义,由于bootloader是可信的,因此在bootloader中增加校验boot.img的功能,就能解决boot分区的可信。

        System分区包括了vold、surfaceflinger、servicemanager、camera等系统核心进程,里面的核心进程基本都由init进程启动,该模块在android手机中可由fastboot、ota方式刷入,该分区里面的单个文件可由adb工具上传和下载,它的大小一般在1G上下,system.img校验的任务就交给了操作系统,由于system分区的容量,不太适合使用校验boot.img的办法,通常的办法有两个:dm-verity和ima;dm-verity采用的是块校验技术,android原生采用的是该办法;ima采用的是运行时实时校验技术,ima是linux内置的可用模块。

2. 安全引导流程图

        

3. 摘要算法与签名算法

        在安全引导过程中经常要使用摘要算法和签名算法,在此介绍几种常用的算法,供参考:

        摘要算法:把任意长度的输入柔和成固定长度的伪随机输出,其具有无论输入消息长度、消息摘要是’随机’的、无陷门单向函数等特点,一般应用于提取数据’指纹’信息和数据完整性校验场景,常用的摘要算法有hmac、sha1、sha256.

        SHA1:以分组为单位处理数据输入,生成一个长度为160比特的消息摘要,应用比较广泛,SHA256是其变种版本.

        HMAC:以一个密钥和一个消息为输入,生成一个长度为128~512比特的消息摘要,它是一个典型的’挑战/响应’身份认证算法.

        签名算法:可以看作是带有密钥的消息摘要算法,并且这个密钥包括公私钥,它是非对称加密算法和消息摘要算法的结合体,具有抗否认的功能,广泛应用于公钥基础设施(PKI),以及许多网络安全机制中,典型的签名算法有RSA、DSA、ECDSA

        RSA:加密是对明文的E次方后除以N后求余的过程,验证的过程与加密的过程一致,不过加密使用私钥,验证使用公钥,目前为止地球上还没有破解方法.

4. 硬件平台安全引导机制概述

        硬件平台安全引导是指系统上电到lk的引导过程,由于该过程与硬件联系紧密,基本都由手机所使用的硬件平台完成,其核心原理同样是验证签名摘要,典型案例有高通平台的secure boot方案,需要了解可去其官网.

5. 安全引导机制实现细节

        一. BOOTLOADER安全引导实现细节 
             1、PC端 USB连接android
             2、PC端Fastboot刷入lk
             3、PC端Fastboot利用hmac算法对lk做信息摘要
             4、PC端将摘要发送给远程服务器
             5、远程服务器校验摘要信息,返回lk是否被篡改的结果
             6、PC端Fastboot根据远程服务器的结果决定是否刷入lk
             7、Lk可信引导完成
        注:LK的可信认证是在‘体外’完成的,主要开发任务在于定制fastboot刷机工具,不影响手机功能实现。

        二. KERNEL 安全引导实现细节
        Boot.img的可信认证由两部分组成:编译阶段签名和运行时阶段校验
        HOST编译阶段:
             1、正常将boot.img编译出来
             2、利用openssl dgst 提取boot.img的摘要信息
             3、利用openssl工具对摘要信息做签名
             4、将boot.img和签名摘要信息重新打包成新的boot.img
        Bootloader运行时阶段:
             1、正常流程运行于启动boot_linux之前
             2、利用openssl dgst提取缓存于emmc中的kernel镜像文件的摘要信息
             3、利用openssl模块解密附加于boot.img中的签名摘要信息
             4、将2、3步骤中的结果对比,相同则证明boot.img可信

        三. SYSTEM 分区安全引导实现细节
        System.img的认证目前有两种办法:ima(运行时细粒度校验)和dm-verity(挂载时粗粒度校验+运行时细粒度)


        Ima:将文件的内容和文件的属性/扩展属性,通过加密哈希生成对应的ima/evm串,以扩展属性的方式保存在文件系统节点中;系统运行时在文件被访问之前,内核            IMA/EVM模块通过校验文件的ima/evm串,来判断文件是否被离线篡改过;该流程分为两部分:编译阶段签名和运行时阶段校验
        HOST编译阶段:
             1、利用openssl dgst 提取文件的摘要信息
             2、将摘要信息串保存于文件的扩展属性security.ima中
             3、利用openssl dgst 提取文件所有扩展属性的摘要信息
             4、利用openssl工具对扩展属性的摘要信息做签名
             5、将签名摘要信息串保存于文件的扩展属性security.evm中
       运行时阶段:
             1、运行于文件被打开前
             2、校验文件的security.evm属性
             3、校验文件的security.ima属性
             4、2、3过程都通过则证明文件没有被离线篡改过
       注:系统启动阶段需要导入签名公钥、文件校验策略,便于内核IMA模块校验文件,此外该方法是细粒度的分区校验,它会在系统运行时对系统产生影响.

        

        

       Dm-verity: 分区映射校验是一种针对分区进行完整性检查的安全机制。它利用哈希树结构去构建整个分区目录的签名信息。系统在启动挂载分区时,内核对挂载的分区进行 签名验证,验证成功则进行挂载操作;同时这种机制允许system分区在读写的时候分块校验,而不是一次性校验整个分区;该过程同样分为两部分: 编译阶段签名和运行时阶段校验,过程与ima类似,但与ima不同的是,dm-verity校验过程在系统启动阶段还拦截了mount操作,且是粗粒度的校验过程, 采用该办法后系统无法使用普通的差分包进行升级,且对系统的启动有一定影响.

        
 

        

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

Android手机可信引导解决方案 的相关文章

  • 如何为ScrollView放置固定图像背景?

    我应该想要滚动视图滚动 而不是背景中的图像 将图像添加到滚动视图框架之前的视图层次结构的较高位置
  • 如何在 Android 中保存相机的临时照片?

    在尝试从相机拍照并将其保存到应用程序的缓存文件夹中时 我没有得到任何可见的结果 应用程序不会崩溃 但在 LogCat 上 当我尝试将 ImageView src 字段设置为刚刚获取的文件的 URI 时 我收到此消息 09 17 14 03
  • 使用workmanager时Firestore脱机持久性错误

    我正在使用一个WorkManger定期从我的中检索信息Firestore当应用程序处于后台和前台时的数据库 此信息用于根据状态更新 UI 因此不同的状态会添加或删除 UI 的不同部分 第一次运行时效果很好 但是 一旦应用程序处于后台并且Wo
  • React Native 从 JavaScript 代码内部访问 strings.xml

    有没有办法访问当前值android app src main res values strings xml从 JavaScript 代码内部 我想为每个构建放置不同的端点 URL 但我什至无法检测到反应本机代码内的构建类型 而不必求助于 D
  • 谷歌坐标认证

    当我尝试连接到 Google 坐标时 总是出现异常GoogleAuthException 我拥有 Google 地图协调中心许可证 我确实使用我的包应用程序名称和 SHA1 在 google 控制台中创建了我的客户端 ID 我将权限添加到清
  • 如何在android中获取Camera2 API的当前曝光

    In android hardware Camera旧的 我使用下面的代码获取当前曝光并获取它Camera Camera Parameters param mCamera getParameters currentExposure para
  • android xamarin 中的 reCaptcha

    我想在 Xamarin android 应用程序中实现验证码 我抓住了这个在 Android 中集成 googles reCaptcha 验证 https www c sharpcorner com article how to integ
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Android 中 Kotlin 协程的正确使用方式

    我正在尝试使用异步更新适配器内的列表 我可以看到有太多的样板 这是使用 Kotlin 协程的正确方法吗 这个可以进一步优化吗 fun loadListOfMediaInAsync async CommonPool try Long runn
  • Android SIP 来电使用带有广播接收器的服务

    大家好 其实我正在尝试创建一个应用程序 支持基于 SIP 通过互联网进行音频呼叫 这里使用本机 sip 我遇到了来电问题 我已经完成了服务的注册部分 但是在接听电话时我无法接听电话 请帮助我 Service file package exa
  • 是否必须删除 Intent extra?

    这可能是一个愚蠢的问题 但是是否有一条规则规定消费活动必须显式删除 Intent 额外内容 或者只有在回收 Intent 对象时才如此 换句话说 如果我总是通过执行以下操作来链接到下一个活动 Intent i new Intent MyCu
  • 无法访问 com.google.android.gms.internal.zzbfm 的 zzbfm 类文件未找到

    我正在将我的 Android 应用程序项目从GCM to FCM 为此 我使用 Android Studio 中的 Firebase 助手工具 并遵循 Google 开发人员指南中的说明 一切都很顺利 并将我的应用程序代码更改为FCM根据助
  • 获取当前 android.intent.category.LAUNCHER 活动的实例

    我创建了一个库项目 并在多个应用程序之间共享 我实现了一个简单的会话过期功能 该功能将在一段时间后将用户踢回到登录屏幕 登录屏幕活动是我的主要活动 因此在清单中它看起来像这样
  • 你的CPU不支持NX

    我刚刚下载了 android studio 但是我遇到了一个问题 当我运行它时 它说你的 cpu 不支持 NX 我应该怎么办 NX 或实际上是 NX 处理器位 是处理器的一项功能 有助于保护您的 PC 免受恶意软件的攻击 当此功能未启用并且
  • 如何使用 IF 检查 TextView 可见性

    我有一个 onCheckedChangeListener 来根据选择的单选按钮显示文本视图 我有 1 个疑问和 1 个难题 想知道是否有人可以帮助我 问题 您能否将单选组默认检查值设置为 否 单选按钮 以便一开始就不会检查任何内容 问题 如
  • Ubuntu 16.04 - Genymotion:找不到 /dev/hw_random

    I install Genymotion on the Ubuntu 16 04 64Bit I created a virtual emulator for Android 6 0 then I run this emulator but
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • 实现滚动选择 ListView 中的项目

    我想使用 ListView 您可以在其中滚动列表来选择一个项目 它应该像一个 Seekbar 但拇指应该是固定的 并且您必须使用该栏来调整它 我面临的一个问题是 我不知道这种小部件是如何调用的 这使得我很难搜索 所以我制作了下面这张图片 以
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 如何将 google+ 登录集成到我的 Android 应用程序中?

    大家好 实际上我需要通过我的应用程序从 google 登录人们 现在我阅读了 google 上的文档 其中指出 要允许用户登录 请将 Google Sign In 集成到您的应用中 初始化 GoogleApiClient 对象时 请求 PL

随机推荐

  • 让Project把周六和周日也计算工期

    GPS平台 网站建设 软件开发 系统运维 找森大网络科技 https cnsendnet taobao com 来自森大科技官方博客 http www cnsendblog com index php p 1046 上之类的教程很少 在摸索
  • 系统架构设计师教程(第2版)

    系统架构设计师教程 第2版 作为全国计算机技术与软件专业技术资格 水平 考试指定用书 系统地介绍了系统架构设计师的基本要求 应具备的基础知识和需要掌握的知识 全书分上 下两篇 共计 20 章 上篇为综合知识 介绍了系统架构设计师应熟练掌握的
  • 前端开发之走进Vue.js

    Vue js作为目前最热门最具前景的前端框架之一 其提供了一种帮助我们快速构建并开发前端项目的新的思维模式 本文旨在帮助大家认识Vue js 了解Vue js的开发流程 并进一步理解如何通过Vue js来构建一个中大型的前端项目 同时做好相
  • 1的1次方+2的2次方+3的3次方+...+n的n次方

    此处n最大取160哦 能力有限大整数的表示还没学会 以后学会了还会继续更的哦 public class Test public static void main String args new Test test1 public void
  • C++学习(四七四)java获取上一级目录

    File externalFile getApplicationContext getExternalFilesDir null storage emulated 0 Android data com example testnativec
  • 使用 Spark MLlib 做 K-means 聚类分析[转]

    原文地址 https www ibm com developerworks cn opensource os cn spark practice4 引言 提起机器学习 Machine Learning 相信很多计算机从业者都会对这个技术方向
  • 竞赛选题 协同过滤电影推荐系统

    文章目录 1 简介 1 设计概要 2 课题背景和目的 3 协同过滤算法原理 3 1 基于用户的协同过滤推荐算法实现原理 3 1 1 步骤1 3 1 2 步骤2 3 1 3 步骤3 3 1 4 步骤4 4 系统实现 4 1 开发环境 4 2
  • Android,我么用原生还是混合?

    本文将从4个角度 讲解分析混合开发 与使用方式 希望给大家更多思路 前言 最近开发几个项目 牵涉到Android的几种开发模式 对于原生态开发 web 应用开发以及混合模式开发 本人认为并不是哪一种就是最好的 哪一种就是最差的 这个完全是根
  • 【ROS】RViz、Gazebo和Navigation的关系

    1 RViz RViz Robot Visualization 机器人可视化 是一个用于可视化机器人系统的开源工具 用于显示和调试机器人的传感器数据 状态信息和运动规划等 它是ROS Robot Operating System 的一部分
  • /c6.e3b.biz/index.php,iptv-m3u-maker/tv.m3u8 at d59f4e688e2b4486d6219f094aac886be53c25d2 · srsman/ip...

    EXTINF 1 group title 其他频道 Oxigeno90 http i50 letio com 9102 aac EXTINF 1 group title 其他频道 ProyectoP http 149 56 23 143 8
  • Linux如何用命令创建文件和文件夹

    linux中如何使用命令创建文件 并执行 1 通过快捷方式 CTRL ALT T键 打开终端命令窗口 我们在终端实现操作 ccoy ccoy PC 2 进入目录之后 转到需要的目录之下 ccoy ccoy PC cd demo ccoy c
  • 价值32k!阿里顶级架构师深度解析SpringBoot进阶原理实战手册

    前言 在当下的互联网应用中 业务体系日益复杂 业务功能也在不断地变化 以典型的电商类应用为例 其背后的业务功能复杂度以及快速迭代要求的开发速度 与5年前的同类业务系统相比 面临着诸多新的挑战 这些挑战中核心的一点就是快速高效地实现系统功能
  • win7访问局域网计算机提示凭据,win7系统访问局域网共享文件时提示输入网络凭据的解决方法?...

    win7系统访问局域网共享文件时提示输入网络凭据的解决方法 最近有用户在将系统升级到win7系统之后 访问局域网共享文件时 系统却弹出输入网络凭据的对话框 这让用户很苦恼 其实这是微软为win7系统添加了新的安全机制导致的 没有密码的访问形
  • 基于STM32的ESP8266天气时钟(1)---------AT指令获取天气数据

    前言 很久以前就想着能够做一个可以显示天气还有时间的小东西 刚好最近有空 研究了一下 发现并没有之前想象的那么难 网上也有很多资料 不过大部分并没有一步一步详细介绍 故把自己的学习过程分享出来 算是自己的输出 也给需要学习的小伙伴提供一下思
  • Vue3的数据监视(Watch)

    引入 vue 的数据监视可以进行数据检测但是要进行数据的引入 import watch from vue 参数配置 一共分为三个参数配置分别为 数据 执行方法 执行条件 watch gt dog age newValue oldValue
  • 问题解决: multiple definition of XXX

    在编译程序的时候 遇到了一个问题 花点时间记录一下 在Qt中创建一个类后 一般是先在 h文件中声明变量与函数 然后在对应的 cpp文件中对各个函数进行定义 这在往常使用中没有任何问题 今天在使用Qt时 在各 cpp源文件编译时出现了许多mu
  • 【满分】【华为OD机试真题2023B卷 JAVA&JS】寻找最大价值的矿堆

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 寻找最大价值的矿堆 知识点广搜 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 给你一个由 0 空地 1 银矿 2 金矿 组成的的地图 矿堆只能由上下左右相邻的金矿或银
  • 今天写shader流光效果,shader代码少了个括号,unity shader compiler卡死且不提示原因...

    今天写shader流光效果 shader代码少了个括号 unity shader compiler卡死且不提示原因 好在找到了原因 shader 代码如下 原理是提高经过的颜色亮度 void surf Input IN inout Surf
  • stm32实现PWM最简单方法

    stm32实现PWM最简单方法 前言 一 PWM概念 二 PWM应用 输出比较功能框图 三 PWM呼吸灯实现 前言 PWM可以用于控制灯的亮度电机转速等 本文以实现呼吸灯为例帮助理解pwm的应用 一 PWM概念 PWM Pulse Widt
  • Android手机可信引导解决方案

    1 概述 Android手机的可信引导过程 主要分为三部分 lk的可信 boot的可信 和system的可信 系统上电到lk的启动过程验证 因为和硬件联系紧密 基本都由各自硬件厂商完成 lk就是bootloader 它由Pre loader