OpenHarmony开发者论坛

标题: OpenHarmony应用如何获取和修改加密分区 [打印本页]

作者: 深开鸿_张守忠    时间: 2023-12-27 11:37
标题: OpenHarmony应用如何获取和修改加密分区
[md]### 简介:

**应用文件加密是一种保护数据安全的方法,可以使得文件在未经授权访问的情况下得到保护。OpenHarmony将数据加密分为EL1,EL2,EL3,EL4四个等级,不同等级存放的文件类型和访问权限如下表。通过读写应用上下文context的area属性,实现获取和修改当前加密分区,引用@ohos.app.ability.contextConstant。**

| **名称** | **值** | **说明**                                                                                                                                                      |
| -------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **EL1**  | **0**  | **设备级加密区,设备开机后可访问的数据区。对于私有文件,如闹铃、壁纸等,应用可以将这些文件放到设备级加密分区(EL1)中,以保证在用户输入密码前就可以被访问。** |
| **EL2**  | **1**  | **用户级加密区,设备开机,首次输入密码后才能够访问的数据区。对于更敏感的文件,如个人隐私信息等可以放在该分区。**                                              |
| **EL3**  | **2**  | **用户级加密区,对于应用中的记录步数、文件下载、音乐播放,需要在锁屏时读写和创建新文件的放在该加密分区比较合适。**                                            |
| **EL4**  | **3**  | **用户级加密区,对于用户安全信息相关的文件,锁屏时不需要读写文件、也不能创建文件,放在该加密分区更合适。**                                                    |

### 文档环境:

* **开发环境:Windows 10专业版**
* **DevEco Studio版本:DevEco Studio 4.0Release (4.0.0.600)**
* **SDK版本:4.1.3.3 (full sdk)**
* **API版本:Version 11**
* **开发板型号:DAYU200(RK3568)**
* **系统版本:OpenHarmony 4.1.5.5**

### 演示demo:

* **新建一个 Stage 框架的 demo 工程,在page/Index.ets中通过 let context = getContext(this) as common.UIAbilityContext; 拿到应用的上下文Context,通过访问的文件路径前缀“/data/storage/elxx”,判断当前需要的加密分区。**
* **通过context.area = contextConstant.AreaMode.ELXXX;(XXX取值1,2,3,4)修改加密分区,即可访问该加密分区当前应用目录下的文件,**

** demo运行效果:**

| **首页**                                                                                                                                                                   | **EL3分区文件列表**                                                                                                                                               | **EL4分区文件列表**                                                                                                                                               |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| ![image](file://D:/project/OpenHarmony_sample/sample_%E9%9C%80%E6%B1%82&%E8%AF%A6%E7%BB%86%E8%AE%BE%E8%AE%A1/el34_dataprotect/screenshots/myPhone_home.jpeg?lastModify=1703648215) | ![image](file://D:/project/OpenHarmony_sample/sample_%E9%9C%80%E6%B1%82&%E8%AF%A6%E7%BB%86%E8%AE%BE%E8%AE%A1/el34_dataprotect/screenshots/el3.jpeg?lastModify=1703648215) | ![image](file://D:/project/OpenHarmony_sample/sample_%E9%9C%80%E6%B1%82&%E8%AF%A6%E7%BB%86%E8%AE%BE%E8%AE%A1/el34_dataprotect/screenshots/el4.jpeg?lastModify=1703648215) |

** 核心代码如下:**

```
import fs from '@ohos.file.fs';
import router from '@ohos.router';
import prompt from '@ohos.promptAction';
import contextConstant from '@ohos.app.ability.contextConstant';
import common from '@ohos.app.ability.common';
import { BusinessError } from '@ohos.base';
import Logger from '@ohos.hilog';

// 通过沙箱路径前缀作为context切换加密分区的标志
const EL1_AREA_FLAG = '/data/storage/el1';
const EL2_AREA_FLAG = '/data/storage/el2';
const EL3_AREA_FLAG = '/data/storage/el3';
const EL4_AREA_FLAG = '/data/storage/el4';

let context = getContext(this) as common.UIAbilityContext;

function updateContextArea(directoryPath: string, context: common.UIAbilityContext): void {
 Logger.info(TAG, "updateContextArea para: " + directoryPath);
 if (directoryPath.includes(EL1_AREA_FLAG)) {
   context.area = contextConstant.AreaMode.EL1;
  } else if (directoryPath.includes(EL2_AREA_FLAG)) {
   context.area = contextConstant.AreaMode.EL2;
  } else if (directoryPath.includes(EL3_AREA_FLAG)) {
   context.area = contextConstant.AreaMode.EL3;
  } else if (directoryPath.includes(EL4_AREA_FLAG)) {
   context.area = contextConstant.AreaMode.EL4;
  } else {
   Logger.error(TAG, "updateContextArea directoryPath: " + directoryPath + " not in el part!");
  }
 Logger.info(TAG, "updateContextArea new context area: " + context.area);
}

@Entry
@Component
export struct MyPhone {
 ...

 @State @Watch('updateFileData') directoryPath: string = BASE_PATH;
 @State fileData: Array<FileStructure> = [];

 onPageShow() {
   AppStorage.SetOrCreate('flashPage',!AppStorage.Get<number>('flashPage'));
   updateContextArea(this.directoryPath, myContext);
  }

 async aboutToAppear() {
   ...
   updateContextArea(this.directoryPath, myContext);
   this.updateFileData();
  }

 // 刷新当前页面数据
 updateFileData() {
   ...
   this.fileData = [];
   try {
     let subdirectory = FileSystem.getSubdirectory(this.directoryPath);
     subdirectory.forEach(item => {
       this.fileData.push(new FileStructure(item.name, item.type, item.time, item.childrenNum, item.fileSize));
     })
   } catch (err) {
     let error: BusinessError = err as BusinessError;
     Logger.error(TAG, `Get subdirectory of path ${this.directoryPath} failed. error code is ${error.code}, message is ${error.message}`);
   }
  }
 ...
 
```

### sample仓地址:

**本功能的sample仓地址:**[https://gitee.com/openharmony/applications\_app\_samples/tree/master/code/BasicFeature/FileManagement/FileManager](https://gitee.com/openharmony/ap ... agement/FileManager)
[/md]




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5