Android加密,android 数据加密,Android加密之全盘加密详解

Android加密,android 数据加密,Android加密之全盘加密详解

本文主要介绍Android加密的整体加密讲解,有很好的参考价值。希望对大家有帮助。来和边肖一起看看吧。

前言

Android的安全性一直备受关注,谷歌也从未停止更新Android系统的安全性,试图实现更安全的移动操作系统。

在Android的安全性方面,有很多模块:

1内核安全性

2应用安全性

3应用程序签名

4认证

5可靠的三通

6 SELinux

7加密

等等

其中加密分为全磁盘加密(Android 4.4推出)和文件级加密(Android 7.0推出)。本文将在加密中讨论全磁盘加密的基础知识。Android 4.4引入了全磁盘加密,Android 5.0进行了大更新。

本文部分片段摘自Android官网,融合了作者个人的理解和知识。

什么是全盘加密

全磁盘加密是用加密密钥对Android设备上的所有用户数据进行编码的过程。设备加密后,用户创建的所有数据在写入磁盘之前都将自动加密,所有读取操作在将数据返回到调用进程之前都将自动解密数据。

Android 5.0引入了以下新功能:

创建了一种快速加密方法,只对数据分区中使用过的块进行加密,以免第一次启动时间过长。目前,只有EXT4和F2FS文件系统支持快速加密。

添加了首次启动时要加密的forceencrypt fstab标记。

增加了对解锁模式和无密码加密的支持。

增加了硬件支持的加密密钥存储空间,使用可信执行环境(TEE,例如TrustZone)的签名功能。

全盘加密运作方式

Android全磁盘加密基于运行在块设备层的内核函数dm-crypt。因此,这种加密方法适用于嵌入式多媒体卡(eMMC)和类似的以块设备形式呈现给内核的闪存设备。YAFFS将直接与原NAND闪存芯片交互,不能完全加密。

全磁盘加密采用128位高级加密标准(AES)算法(带密码块链接(CBC)和ESSIV:SHA256)。用128位AES算法加密主密钥,会调用OpenSSL库。对于此密钥,您必须使用128位或更多位(您可以选择256位)。

Android版有以下四种加密状态:

系统默认值

个人识别号码

密码

解锁模式

当设备第一次启动时,它会创建一个随机生成的128位主密钥,然后使用默认密码和存储的salt对其进行哈希处理。默认密码是“默认密码”。但是,设备也会通过TEE(例如TrustZone)对生成的哈希进行签名。TEE用相应签名的散列加密主密钥。

可以在Android开源项目的cryptfs.c文件中找到定义好的默认密码。

当用户在设备上设置PIN/密码或密码时,只有128位密钥会被重新加密和存储(即,更改用户PIN/密码/解锁模式不会导致用户数据被重新加密)。请注意,受管理的设备可能受到PIN码、解锁模式或密码的限制。

加密操作由init和vold管理。Init负责调用vold,然后vold会在init中设置相关属性来触发事件。系统的其他部分也会查看这些属性来执行各种任务,例如报告状态、提示输入密码或在发生严重错误时提示恢复出厂设置。要调用vold中的加密函数,系统会使用命令行工具vdc的cryptfs命令:checkpw、restart、enablecrypto、changepw、cryptocomplete、verifypw、setfield、getfield、mountdefaultencrypted、getpwtype、getpw和clearpw。

要加密、解密或清空/data,不得装入/data。但是要显示任何界面,都必须启动框架,框架需要/数据才能运行。为了解决这一冲突,将在/data上挂载一个临时文件系统。通过这个文件系统,Android可以提示输入密码,显示进度,或者根据需要建议清除数据。但是,这种文件系统会带来以下限制:要从临时文件系统切换到实际/数据文件系统,系统必须停止所有在临时文件系统中打开文件的进程,并在实际/数据文件系统中重新启动这些进程。为此,所有服务必须属于以下组之一:核心、主要和late_start。

核心:启动后就再也关不上了。

Main:关机,用户输入磁盘密码后重启。

late _ start:/数据在解密和加载之前不会启动。

为了触发这些操作,vold.decrypt属性被设置为各种字符串。要结束并重新启动服务,请使用以下init命令:

Class_reset:停止相应的服务,但允许它通过class_start重新启动。

Class_start:重新启动相应的服务。

Class_stop:停止相应的服务并添加SVC_DISABLED标志。停止的服务将是不正确的。

Class_start响应。

加密流程和启动流程

使用 forceencrypt 加密新设备

这是Android 5.0设备刚启动时的常规流程。

使用forceencrypt标志检测未加密的文件系统。

/data不加密,但需要加密,因为forceencrypt强制进行这种加密。卸载/数据。

开始加密/数据

Vold . decrypt=" trigger _ encryption "会触发init.rc,这样vold就不用密码加密/数据了。(因为这应该是新设备,所以没有设置密码。)

正在加载tmpfs

d将vold a tmpfs /data(使用ro.crypto.tmpfs_options中的tmpfs选项)并将vold.encrypt_progress属性设置为0。Vold准备tmpfs /data启动加密系统,设置vold.decrypt属性为trigger_restart_min_framework。

启动框架以显示进度

由于设备上几乎没有要加密的数据,加密过程很快就会完成,所以实际上进度条通常是不显示的。有关进度界面的更多详细信息,请参见加密现有设备。

/数据加密后,关闭框架

d会将vold.decrypt设置为trigger_default_encryption,这将启动defaultcrypto服务。(这将启动以下进程来加载默认的加密用户数据。)trigger_default_encryption会检查加密类型,查看/data encryption是否使用密码。由于Android 5.0设备刚启动时是加密的,所以不应该设置密码,所以我们要解密加载/data。

负载/数据

接下来,init将使用从ro.crypto.tmpfs_options(在init.rc中设置)中选择的参数来加载tmpfs RAMDisk中的/data。

开始帧

将vold设置为trigger_restart_framework,这将继续正常的启动过程。

启动默认情况下未加密的加密设备。

当您使用密码启动加密设备时,会发生此过程。设备的密码可以是PIN码、解锁模式或密码。

用密码检测加密设备。

Android设备将被发现是加密的,因为设置了ro.crypto.state="encrypted "标志。

由于/data是用密码加密的,vold会将vold.decrypt设置为trigger_restart_min_framework。

正在加载tmpfs

Init将设置5个属性来保存为/data提供的初始加载选项(包含从init.rc传入的参数)。Vold将使用这些属性来设置加密映射:

ro.crypto.fs_type

ro.crypto.fs_real_blkdev

ro.crypto.fs_mnt_point

ro.crypto.fs_options

Ro.crypto.fs_flags (ASCII码8位十六进制数字,从0x开始)

启动框架以提示输入密码。

框架将启动并看到vold.decrypt已被设置为trigger_restart_min_framework。这让框架知道它是在tmpfs /data disk中启动的,需要获取用户密码。

但是,它首先需要确认磁盘是否已经正确加密。它向vold发送cryptfs cryptocomplete命令。如果加密已经成功完成,vold将返回0;如果发生内部错误,将返回-1;如果加密没有成功完成,将返回-2。D vold通过查看CRYPTO_ENCRYPTION_IN_PROGRESS标签的加密元数据来确定应该返回的值。如果设置了此标志,加密过程会中断,并且设备上没有可用的数据。如果vold返回错误,应该在界面中显示一条消息,提示用户重新启动设备并将其恢复到出厂设置,并且应该在界面中提供一个按钮供用户执行此操作。

通过密码解密数据

cryptfs cryptocomplete成功后,框架会显示一个界面,提示用户输入磁盘密码。该接口将向vold发送cryptfs checkpw命令,以检查用户输入的密码。如果密码正确(通过在临时位置成功加载解密的/数据,然后卸载它来确定),vold将在ro.crypto.fs_crypto_blkdev属性中保存解密的块设备的名称,并向接口返回状态0。如果密码不正确,接口将返回-1。

停止框架

界面中会显示加密的启动图,然后使用cryptfs restart命令调用vold。d会将vold.decrypt属性设置为trigger_reset_main,这将导致init.rc执行class_reset main命令。此命令停止主类中的所有服务,以便卸载tmpfs /data。

负载/数据

然后,vold将挂载解密的实际/数据分区,并准备新的分区(如果在加密中使用了第一个版本不支持的数据清理选项,可能永远也不会准备好)。它将vold.post_fs_data_done属性设置为0,然后将vold.decrypt设置为trigger_post_fs_data。这将导致init.rc运行其post-fs-data命令。这些命令创建所有必要的目录或链接,然后将vold.post_fs_data_done设置为1。当vold在这个属性中看到1时,它将vold.decrypt属性设置为trigger_restart_framework。这将导致init.rc再次启动主类中的服务,并启动late_start类中的服务(这是设备启动后第一次启动这些服务)。

开始整帧。

现在,框架将使用解密/数据文件系统启动它的所有服务,然后可以使用该系统。

代码解读

下面结合上一章的过程,用下面的代码来分析在没有默认加密的情况下,启动加密设备的过程。

# Android fstab文件。

#src mnt_point类型

.

/dev/block/platform/SOC . 0/f 9824900 . SDH ci/by-name/user data/data ext 4 no time,nosuid,nodev,barrier=1,data=ordered,nomblk_io_submit,noauto_da_alloc,errors=panic wait,check,fileencryption

.

默认

该配置在文件device/lge/bullhead/fstab _ FBE . bullhead中定义。

与上面的代码一样,在/data的末尾添加fileencryption将会加密整个磁盘。

步骤1:检测设有密码的已加密设备

//设置ro.crypto.state标志,手机已经被用户加密。

static int do _ mount _ all(const STD:vector STD:string args){

.

if(ret==FS _ MGR _ Mn tall _ DEV _ NEEDS _ ENCRYPTION){

ActionManager:GetInstance()。QueueEventTrigger(' encrypt ');

} else if(ret==FS _ MGR _ Mn tall _ DEV _ may _ BE _ ENCRYPTED){

//全磁盘加密,ro.crypto.state=加密,ro.crypto.type=块

property_set('ro.crypto.state ',' encrypted ');

property_set('ro.crypto.type ',' block ');

//发送vdc命令defaultcrypto

ActionManager:GetInstance()。QueueEventTrigger(' default crypto ');

.

} else if(ret==FS _ MGR _ Mn tall _ DEV _ FILE _ ENCRYPTED){

if (e4crypt_install_keyring()) {

return-1;

}

property_set('ro.crypto.state ',' encrypted ');

property_set('ro.crypto.type ',' file ');

.

返回ret

}

这个方法在文件系统/core/init/builds.cpp中定义。

#一次性调用来处理加密卷。

在# do_mount_all中写入命令defaultcrypto,并执行vdc send命令mountdefaultencrypted。

关于默认加密

exec-root-/system/bin/VDC-wait cryptfs mount default encrypted

# vold会将vold.decrypt设置为trigger_restart_framework(默认

#加密)或触发器_重启_最小_框架(其他加密)

#一次性调用来加密未加密的卷

加密时

开始表面投掷器

exec-root-/system/bin/VDC-wait cryptfs就地启用加密默认noui

# vold会将vold .解密设置为触发器_重启_框架(默认

#加密)

这个服务定义在文件系统/电压/直流中。

int CryptCommandListener:CryptfsCmd:run命令(socket client * CLI,

int argc,char **argv) {

.

} else if(sub command==' mountdefaultencrypted '){

.

//执行cryptfs _ mount _ default _ encrypted

STD:thread(cryptfs _ mount _ default _ encrypted).detach();

}

.

}

这个方法定义在文件vold/CryptCommandListener.cpp中。

int cryptfs _ mount _ default _ encrypted(void)

{

int crypt _ type=crypt fs _ get _ password _ type();

.

} else if (crypt_type!=CRYPT_TYPE_DEFAULT) {

SLOGD('密码不是默认的-'

启动最小框架以提示');

//不是默认加密,设置沃尔德。解密=触发器重启最小框架

property_set('vold.decrypt ',' trigger _ restart _ min _ framework ');

返回0;

} else if(cryptfs _ check _ passwd(DEFAULT _ PASSWORD)==0){

.

这个方法定义在文件system/vold/cryptfs.c中。

#属性沃尔德。解密==触发重启最小框架时执行

在属性上:vold。解密=触发器重启最小框架

# A/B标记成功启动的更新验证程序。

执行-root-/system/bin/update _ verifier trigger _ restart _ min _ framework

class_start main

这个服务定义在服务系统/核心/根目录/init.rc中。

class_start main可知重启主要的类别的服务主要的。类别的服务包括:

会重启合子。

步骤2:装载tmpfs

受精卵启动后,会叉子()系统_进程进程,就是运行系统服务器代码了。但是系统_过程的运行需要正常的用户空间(/data),所以,需要临时挂载tmpfs分区,这个分区是在内存里分配的临时空间。

int命令监听器:storage cmd:run命令(套接字客户端* CLI,

int argc,char **argv) {

.

如果(!strcmp(argv[1],' mount all '){

如果(argc!=2) {

CLI-send msg(响应代码:CommandSyntaxError,'用法:mountall ',false);

返回0;

}

//挂载所有设备

fs _ mgr _ mount _ all(fstab);

CLI-发送消息(响应代码:CommandOkay,' Mountall运行成功,假);

返回0;

}

这个方法定义在文件系统/vold/命令监听器。卡片打印处理机(Card Print Processor的缩写)中。

int fs _ mgr _ mount _ all(struct fstab * fstab)

{

.

/*安装(2)返回错误,处理可加密/可格式化的情况*/

bool wiped=partition _ wiped(fstab-RECs[top _ idx]).blk _ device);

//挂载tmpfs临时分区

if(fs _ mgr _ do _ tmpfs _ mount(fstab-RECs[attempted _ idx]).mount_point) 0) {

错误计数;

继续;

}

//全盘加密

encryptable=FS _ MGR _ Mn tall _ DEV _ may _ BE _ ENCRYPTED;

.

}

这个方法定义在文件系统/核心/文件系统管理器/文件系统管理器中。

步骤3:启动框架以提示输入密码

私有void startBootstrapServices() {

//如果我们正在加密设备,则仅运行"核心"应用。

//启动最小框架显示密码输入界面,仅启动coreApp,在AndroidManifest.xml中声明。

//此时启动的应用在tmpfs临时分区,所以,所有应用都是原始安装状态,不包含任何用户使用产生的数据。

string cryptState=系统属性。get(' vold。解密’);

if(ENCRYPTING _ state。equals(cryptState)){

Slog.w(标签,'检测到加密正在进行-仅解析核心应用');

mOnlyCore=true

} else if(加密_状态。equals(cryptState)){

Slog.w(标签,'设备加密-仅解析核心应用');

mOnlyCore=true

}

.

mPackageManagerService=packagemanagerservice。main(mSystemContext,安装程序,

mFactoryTestMode!=工厂测试. FACTORY_TEST_OFF,monly core);

.

}

这个方法定义在文件框架/基础/服务/Java/com/Android/服务器/系统服务器。Java 语言(一种计算机语言,尤用于创建网站)中。

私有PackageParser .软件包scanPackageLI(文件扫描文件,int parseFlags,int scanFlags,

长当前时间,用户句柄用户)引发PackageManagerException {

if (DEBUG_INSTALL) Slog.d(TAG,'解析:' scan file ');

包解析器PP=新的包解析器();

PP。setseparateprocesses(mSeparateProcesses);

//设置仅解析仅核心应用程序,

PP。setonlycompresses(monly core);

.

}

这个方法定义在文件frameworks/base/services/core/Java/com/Android/server/pm/package manager service。Java 语言(一种计算机语言,尤用于创建网站)中

私有包parseClusterPackage(文件packageDir,int标志)抛出PackageParserException {

最终package lite=parseClusterPackageLite(package dir,0);

//如果不是!lite.coreApp,跳过该app,即启动时,不会安装该应用

if(monlycrepes!lite.coreApp) {

抛出新的PackageParserException(INSTALL _ PARSE _ FAILED _ MANIFEST _ formattered,

不是核心app:‘包目录);

}

这个方法定义在文件框架/基础/核心/Java/Android/内容/pm/包解析器。Java 语言(一种计算机语言,尤用于创建网站)中。

安卓中定义为coreApp的应用有:

框架-res.apk的显示配置文件如下:

步骤4:通过密码解密数据

这个过程不再阐述。

步骤5:停止框架

#重启主要的类别服务

在属性上:vold。解密=触发重置主

class_reset main

这个设置定义在文件系统/核心/根目录/init.rc中。

步骤6:装载 /data

static int do _ mount _ all(const STD:vector STD:string args){

pid _ t pid

.

//

if(ret==FS _ MGR _ Mn tall _ DEV _ NEEDS _ ENCRYPTION){

//发送加密事件到志愿防卫队志愿保卫队

ActionManager:GetInstance().QueueEventTrigger(' encrypt ');

} else if

.

}

这个方法定义在文件system/core/init/builtins.cpp中。

加密时

开始表面投掷器

exec-root-/system/bin/VDC-wait cryptfs就地启用加密默认noui

# vold会将vold .解密设置为触发器_重启_框架(默认

#加密)

这个设置定义在文件系统/电压/直流中。

加密时

开始表面投掷器

#发送命令启用加密到沃尔德

exec-root-/system/bin/VDC-wait cryptfs就地启用加密默认noui

# vold会将解密设置为触发器_重启_框架(默认

#加密)

这个设置定义在文件系统/电压/直流中。

int CryptCommandListener:CryptfsCmd:run命令(socket client * CLI,

int argc,char **argv) {

} else if(子命令=='cryptocomplete') {

如果(!check_argc(cli,子命令,argc,2,'')返回0;

dumpArgs(argc,argv,-1);

RC=crypt fs _ crypto _ complete();

//命令是启用加密

} else if(子命令=='enablecrypto') {

.

//生成为线程,这样初始化可以向沃尔德发回命令,而无需

//导致死锁,通常是准备_数据_文件系统的结果。

char* arg2=argc 2?strdup(argv[2]):NULL;

char* arg4=argc 4?strdup(argv[4]):NULL;

//执行启用加密方法

std:thread(do_enablecrypto,arg2,arg4,type,no_ui).detach();

}

这个方法定义在文件系统/vold/crypt命令监听器。卡片打印处理机(Card Print Processor的缩写)中。

static int do _ enable crypto(char * arg 2,char* arg4,int type,bool no_ui) {

内部rc

(同Internationalorganizations)国际组织尝试;

对于(尝试次数=0;尝试2;尝试){

//不是默认加密,运行方法cryptfs_enable()

if (type==CRYPT_TYPE_DEFAULT) {

rc=cryptfs_enable_default(arg2,no _ ui);

}否则{

rc=cryptfs_enable(arg2,type,arg4,no _ ui);

}

.

return-1;

}

这个方法定义在文件系统/vold/crypt命令监听器。卡片打印处理机(Card Print Processor的缩写)中。

int cryptfs_enable(char *howarg,int type,char *passwd,int no_ui)

{

返回crypt fs _ enable _ internal(howarg,type,passwd,no _ ui);

}

这个方法定义在文件system/vold/cryptfs.c中。

int cryptfs _ enable _ internal(char * howarg,int crypt_type,char *passwd,

int no_ui)

{

/*重新启动框架。*/

/*在/数据上创建必要的路径*/

if (prep_data_fs()) {

转至错误关闭

}

}

这个方法定义在文件system/vold/cryptfs.c中。

静态int prep_data_fs(空)

{

property _ set(' vold。post _ fs _ data _ done ',' 0 ');

//设置沃尔德。decrypt=trigger _ post _ fs _ data,触发初始化。罗马天主教

property_set('vold.decrypt ',' trigger _ post _ fs _ data ');

SLOGD('刚触发post _ fs _ data \ n ');

/*最多等待50秒,希望用时更短*/

for(I=0;iDATA _ PREP _ TIMEOUTi ) {

char p[PROPERTY _ VALUE _ MAX];

//等待初始化设置vold.post_fs_data_done=1

property _ get(' vold。post _ fs _ data _ done ',p,' 0 ');

if (*p=='1') {

打破;

}否则{

美国LEEP(50000);

}

}

}

这个方法定义在文件system/vold/cryptfs.c中。

对属性:vold。decrypt=trigger _ post _ fs _ data

触发后满量程数据

这个设置定义在文件系统/核心/根目录/init.rc中。

#创建/数据子目录和链接,启动服务

关于后金融服务数据

#我们再次使用chown/chmod /data,因为增加是作为根缺省值运行的

chown系统系统/数据

chmod 0771 /data

#我们恢复侦察/数据以防用户数据分区被重置。

恢复重建/数据

#开始调试器使调试早期启动崩溃更容易。

开始调试

开始调试64

习武.彭添加的#task4597305,用于将对数猫输出到通用异步收发报机

启动logcat2uart

#确保我们有设备加密密钥。

启动沃尔德

安装密钥/数据

#在数据分区完成后尽快启动引导程序

#安装以收集更多数据。

mkdir/data/bootchart 0755 shell shell

bootchart_init

.

mkdir /data/system_de 0770系统系统

mkdir /data/system_ce 0770系统系统

mkdir /data/misc_de 01771系统杂项

mkdir /data/misc_ce 01771系统杂项

mkdir /data/user 0711系统系统

mkdir /data/user_de 0711系统系统

符号链接/数据/数据/数据/用户/0

mkdir/data/media 0770 media _ rw media _ rw

mkdir/data/media/OBB 0770 media _ rw media _ rw

init_user0

#如果初始化设备文件中没有fs-后期数据操作,则

#必须取消对该行的注释,否则加密文件系统

#行不通。

#设置指示(由沃尔德检查),表明我们已完成此操作

#设置道具卷。post _ fs _ data _ done 1

这个设置定义在文件系统/核心/根目录/init.rc中。

静态int cryptfs _ restart _ internal(int restart _ main)

{

//初始化做完后满量程数据,继续往下执行代码

if (prep_data_fs()) {

return-1;

}

//初始化做完后满量程数据,vold将解密设为触发器_重启_框架,触发初始化

/*启动服务类主要的和late_start */

property_set('vold.decrypt ',' trigger _ restart _ framework ');

}

这个方法定义在文件system/vold/cryptfs.c中。

#重启所有服务

在属性上:vold。解密=trigger _ restart _ framework

# A/B标记成功启动的更新验证程序。

exec-root-/system/bin/update _ verifier触发器_重启_框架

class_start main

上课_迟到_开始

步骤7:启动整个框架

沃尔德。解密=trigger _ restart _ framework,框架就可以正常启动了。

加密属性

沃尔德和初始化之间通过设置属性进行通信。下面列出了可用的加密属性。

vold 属性

属性说明

vold .解密触发器_加密以无密码方式加密存储卷。

vold .解密触发器_默认_加密检查存储卷是否采用了无密码加密。如果是,则解密并装载存储卷;如果不是,则将沃尔德。解密设为触发_重启_最小_框架。

vold .解密触发器_重置_主由沃尔德设置,用于关闭提示输入磁盘密码的界面。

vold .解密触发器_发布文件系统_数据由沃尔德设置,用于准备具有必要目录等内容的/数据。

vold .解密触发器_重启_框架由沃尔德设置,用于启动实际框架和所有服务。

vold .解密触发器_关机_框架由沃尔德设置,用于关闭整个框架以开始加密。

vold .解密触发器_重启_最小_框架由沃尔德设置,用于启动加密进度条界面或提示输入密码,具体取决于ro.crypto状态的值。

沃尔德。加密_进度框架启动时,如果设置了此属性,则会进入进度条界面模式。

vold.encrypt _进度0到100进度条界面中应按照设置显示百分比值。

vold .加密_进度错误_部分加密进度条界面中应显示一条消息,告诉用户加密失败,并且界面中应为用户提供一个用于将设备恢复出厂设置的按钮。

D.encrypt _ Progress error _ Reboot _ Failed进度条界面应该显示一条消息告诉用户加密已经完成,界面应该为用户提供一个重启设备的按钮。这种错误不应该发生。

D.encrypt _ progress error _ Not _ Encrypted进度条界面应该显示一条消息,告诉用户发生了错误,没有加密的数据或者数据已经丢失,并且应该在界面中提供一个重启系统的按钮。

D.encrypt _ progress error _ Shutting _ Down进度条界面没有运行,所以不清楚谁会回应这个错误。在任何情况下都不应该出现这种错误。

vold.post_fs_data_done 0在vold.decrypt设置为trigger_post_fs_data之前由vold设置。

在post-fs-data任务完成后,立即由init.rc或init.rc设置volpost _ fs _ data _ done1。

init 属性

属性描述

Ro.crypto.fs_crypto_blkdev由vold命令checkpw设置,供vold命令restart将来使用。

Ro.crypto.state unencrypted由init置位,表示相应的系统运行在未加密/dataro.crypto.stateencrypted中。

ro.crypto.fs_type

ro.crypto.fs_real_blkdev

ro.crypto.fs_mnt_point

ro.crypto.fs_options

ro.crypto.fs_flags

这五个属性是init在尝试加载/data(包含从init.rc传入的参数)时设置的。Vold将使用这些属性来设置加密映射。

Ro.crypto.tmpfs_options由init.rc设置,包含init在挂载tmpfs/数据文件系统时应该使用的选项。

init 操作

关于后金融服务数据

在非加密上

在属性上:vold . decrypt=trigger _ reset _ main

对属性:vold . decrypt=trigger _ post _ fs _ data

在属性上:vold . decrypt=trigger _ restart _ min _ framework

在属性上:vold . decrypt=trigger _ restart _ framework

在属性上:vold . decrypt=trigger _ shut down _ framework

对属性:vold . decrypt=trigger _ encryption

on属性:vold . decrypt=trigger _ default _ encryption。

Android加密分析到此为止。

以上关于安卓加密的详细解释,就是边肖分享的全部内容。希望给大家一个参考,支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • windowsandroid手机版下载,windowsandroid安装apk
  • windowsandroid手机版下载,windowsandroid安装apk,WindowsAndroid 安装教程详解
  • android调用webview方法,androidwebview是什么,Android 中 WebView 的基本用法详解
  • android传感器高级编程,Android传感器,Android编程之光线传感器用法详解
  • android.app.Dialog,android自定义dialog对话框,Android开发笔记之-Dialog的使用详解
  • android 图片视频轮播框架,androidlayout轮播图,Android实现炫酷轮播图效果
  • android里的viewpager,安卓自定义view流程,Android自定义引导玩转ViewPager的方法详解
  • android里的viewpager,android viewpager详解
  • android里的viewpager,android viewpager详解,Android自定义超级炫酷的ViewPage指示器
  • android调用webview方法,androidwebview是什么
  • android设置控件宽度,android获取屏幕宽度和高度
  • android设置控件宽度,android获取屏幕宽度和高度,Android中获取控件宽高的4种方法集合
  • android蓝牙开发的基本流程,安卓蓝牙app开发教程
  • android蓝牙开发的基本流程,安卓蓝牙app开发教程,android蓝牙简单开发示例教程
  • android菜单栏,android菜单控件
  • 留言与评论(共有 条评论)
       
    验证码: