本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。