[经验分享] OpenHarmony应用如何获取和修改加密分区 原创

深开鸿_张守忠 显示全部楼层 发表于 2023-12-27 11:37:21

简介:

应用文件加密是一种保护数据安全的方法,可以使得文件在未经授权访问的情况下得到保护。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 image image

核心代码如下:

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

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部