鸿蒙数据防泄漏(DLP)【Data Loss Prevention Kit开发指导】

Data Loss Prevention Kit开发指导

DLP是系统提供的系统级的数据防泄漏解决方案,提供一种称为DLP的文件格式。后缀格式为“原始文件名(包含原始文件后缀).dlp”,例如: “test.docx.dlp”,文件由授权凭证和原始文件密文组成。

通过端云协同认证(需要联网)来获取文件的访问授权,授权类型包含只读、编辑、文件拥有者三种。

  • 只读:能读取文件内容但不能修改。
  • 编辑:能够读写文件内容,但不能修改文件权限配置。
  • 文件拥有者:可读写文件、修改权限配置、恢复原始原始文件等。

应用需要访问DLP文件时,系统会自动安装应用的DLP沙箱分身应用,相当于完全独立的应用,数据和配置会继承原应用,但相互之间并不共享。分身应用在运行时会处于DLP沙箱环境中,访问外部的权限会被限制,以防止数据的泄漏。每当打开一个新的DLP文件会生成一个应用沙箱分身,沙箱应用之间也是相互隔离的,当应用关闭后应用分身会自动卸载,沙箱期间产生的临时数据也会丢弃。

正常情况下,应用不会感知到沙箱的存在,访问的也是解密后的明文,和访问普通文件没有区别,但由于DLP沙箱会限制其访问外部的权限(例如网络、剪切板、截屏、录屏、蓝牙等)。为了更好的用户体验,需要应用进行适配,例如文件只读的情况下,不应显示“保存”按钮,不应主动联网等。

沙箱限制

当应用进入DLP沙箱状态时,可以申请的权限将受到限制,根据DLP文件授权类型不同,限制也不相同,如下表:

权限名说明授权类型:只读授权类型:编辑/文件拥有者
ohos.permission.USE_BLUETOOTH允许应用使用蓝牙。禁止禁止
ohos.permission.INTERNET允许应用访问网络。禁止禁止
ohos.permission.DISTRIBUTED_DATASYNC允许应用与远程设备交换用户数据(如图片、音乐、视频、及应用数据等)。禁止禁止
ohos.permission.WRITE_MEDIA应用读写用户媒体文件,如视频、音频、图片等,需要申请此权限。禁止允许
ohos.permission.NFC_TAG允许应用使用NFC。禁止允许

接口说明

接口名描述
isDLPFile(fd: number): Promise isDLPFile(fd: number, callback: AsyncCallback): void判断是否是dlp文件
getDLPPermissionInfo(): Promise getDLPPermissionInfo(callback: AsyncCallback): void获取当前沙箱应用的权限类型
getOriginalFileName(fileName: string): string获取dlp文件原始文件名
getDLPSuffix(): string获取dlp文件dlp后缀名
on(type: ‘openDLPFile’, listener: Callback): void注册dlp文件打开事件监听,用于原始应用获取dlp文件打开事件
off(type: ‘openDLPFile’, listener?: Callback): void取消dlp文件打开事件监听
isInSandbox(): Promise isInSandbox(callback: AsyncCallback): void判断当前是否是dlp沙箱应用
getDLPSupportedFileTypes(): Promise<Array> getDLPSupportedFileTypes(callback: AsyncCallback<Array>): void获取当前系统支持添加权限保护的文件格式类型
setRetentionState(docUris: Array): Promise setRetentionState(docUris: Array, callback: AsyncCallback): void设置dlp分身应用保留状态
cancelRetentionState(docUris: Array): Promise cancelRetentionState(docUris: Array, callback: AsyncCallback): void取消dlp分享应用保留状态
getRetentionSandboxList(bundleName?: string): Promise<Array> getRetentionSandboxList(bundleName: string, callback: AsyncCallback<Array>): void getRetentionSandboxList(callback: AsyncCallback<Array>): void获取当前保留沙箱列表
getDLPFileAccessRecords(): Promise<Array> getDLPFileAccessRecords(callback: AsyncCallback<Array>): void获取dlp文件访问记录
setSandboxAppConfig(configInfo: string): Promise设置沙箱应用配置信息
getSandboxAppConfig(): Promise查询沙箱应用配置信息
cleanSandboxAppConfig(): Promise清理沙箱应用配置信息
startDLPManagerForResult(context: common.UIAbilityContext, want: Want): Promise在当前UIAbility界面以无边框形式打开DLP权限管理应用(只支持Stage模式)

开发步骤

  1. 引入[dlpPermission]模块。

    import { dlpPermission } from '@kit.DataLossPreventionKit';
    
  2. 打开DLP文件,系统会自动安装应用的DLP沙箱分身应用。以下代码应在应用页Ability中使用。

    async OpenDlpFile(dlpUri: string, fileName: string, fd: number) {
      let want:Want = {
        "action": "ohos.want.action.viewData",
        "bundleName": "com.example.example_bundle_name",
        "abilityName": "exampleAbility",
        "uri": dlpUri,
        "parameters": {
          "fileName": {
            "name": fileName
          },
          "keyFd": {
            "type": "FD",
            "value": fd
          }
        }
      }
    
      try {
        console.log('openDLPFile:' + JSON.stringify(want));
        console.log('openDLPFile: delegator:' + JSON.stringify(this.context));
        this.context.startAbility(want);
      } catch (err) {
        console.error('openDLPFile startAbility failed', (err as BusinessError).code, (err as BusinessError).message);
        return;
      }
    }
    

    以上代码需要在module.json5文件中增加ohos.want.action.viewData:

      "skills":[
        {
          "entities":[
            ...
          ],
          "actions":[
            ...
            "ohos.want.action.viewData"
          ]
        }
      ]
    
  3. 查询当前应用是否在沙箱中。

    dlpPermission.isInSandbox().then((data)=> {
      console.log('isInSandbox, result: ' + JSON.stringify(data));
    }).catch((err:BusinessError) => {
      console.log('isInSandbox: ' + JSON.stringify(err));
    });
    
  4. 查询当前编辑的文件权限,根据文件授权的不同,DLP沙箱被限制的权限有所不同,参考[沙箱限制]

    dlpPermission.getDLPPermissionInfo().then((data)=> {
      console.log('getDLPPermissionInfo, result: ' + JSON.stringify(data));
    }).catch((err:BusinessError) => {
      console.log('getDLPPermissionInfo: ' + JSON.stringify(err));
    });
    
  5. 获取当前可支持DLP方案的文件扩展名类型列表,用于应用判断能否生成DLP文件,可用在实现类似文件管理器设置DLP权限的场景。

    dlpPermission.getDLPSupportedFileTypes((err, result) => {
      console.log('getDLPSupportedFileTypes: ' + JSON.stringify(err));
      console.log('getDLPSupportedFileTypes: ' + JSON.stringify(result));
    });
    
  6. 判断当前打开文件是否是DLP文件。

    import { dlpPermission } from '@kit.DataLossPreventionKit';
    import { fileIo } from '@kit.CoreFileKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    
    let uri = "file://docs/storage/Users/currentUser/Desktop/test.txt.dlp";
    let file = fileIo.openSync(uri);
    try {
      let res = dlpPermission.isDLPFile(file.fd); // 是否加密DLP文件
      console.info('res', res);
    } catch (err) {
      console.error('error', (err as BusinessError).code, (err as BusinessError).message); // 失败报错
    }
    fileIo.closeSync(file);
    
  7. 订阅、取消订阅DLP打开事件。

    event(info: dlpPermission.AccessedDLPFileInfo) {
      console.info('openDlpFile event', info.uri, info.lastOpenTime)
    }
    unSubscribe() {
      try {
        dlpPermission.off('openDLPFile', this.event); // 取消订阅
      } catch (err) {
        console.error('error', (err as BusinessError).code, (err as BusinessError).message); // 失败报错
      }
    }
    subscribe() {
      try {
        dlpPermission.on('openDLPFile', this.event); // 订阅
      } catch (err) {
        console.error('error', (err as BusinessError).code, (err as BusinessError).message); // 失败报错
      }
    }
    onCreate() {
     this.subscribe();
    }
    onDestroy() {
     this.unSubscribe();
    }
    
  8. 获取DLP文件打开记录。

    async getDLPFileAccessRecords() {
      try {
        let res:Array<dlpPermission.AccessedDLPFileInfo> = await dlpPermission.getDLPFileAccessRecords(); // 获取DLP访问列表
        console.info('res', JSON.stringify(res))
      } catch (err) {
        console.error('error', (err as BusinessError).code, (err as BusinessError).message); // 失败报错
      }
    }
    
  9. 获取DLP文件保留沙箱记录。

    async getRetentionSandboxList() {
      try {
        let res:Array<dlpPermission.RetentionSandboxInfo> = await dlpPermission.getRetentionSandboxList(); // 获取沙箱保留列表
        console.info('res', JSON.stringify(res))
      } catch (err) {
        console.error('error', (err as BusinessError).code, (err as BusinessError).message); // 失败报错
      }
    }
    
  10. 设置沙箱应用配置信息。

    async setSandboxAppConfig() {
      try {
        await dlpPermission.setSandboxAppConfig('configInfo'); // 设置沙箱应用配置信息
      } catch (err) {
        console.error('error', (err as BusinessError).code, (err as BusinessError).message); // 失败报错
      }
    }
    
  11. 清理沙箱应用配置信息。

    async cleanSandboxAppConfig() {
      try {
        await dlpPermission.cleanSandboxAppConfig(); // 清理沙箱应用配置信息
      } catch (err) {
        console.error('error', (err as BusinessError).code, (err as BusinessError).message); // 失败报错
      }
    }
    
  12. 查询沙箱应用配置信息。

    async getSandboxAppConfig() {
      try {
        let res:string = await dlpPermission.getSandboxAppConfig(); // 查询沙箱应用配置信息
        console.info('res', JSON.stringify(res))
      } catch (err) {
        console.error('error', (err as BusinessError).code, (err as BusinessError).message); // 失败报错
      }
    }
    
  13. 以无边框形式打开DLP权限管理应用。此方法只能在UIAbility上下文中调用,只支持Stage模式。

    import { dlpPermission } from '@kit.DataLossPreventionKit';
    import { common, UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    
    try {
      let context = getContext() as common.UIAbilityContext; // 获取当前UIAbilityContext
      let want: Want = {
        "uri": "file://docs/storage/Users/currentUser/Desktop/1.txt",
        "parameters": {
          "displayName": "1.txt"
        }
      }; // 请求参数
      dlpPermission.startDLPManagerForResult(context, want).then((res) => {
        console.info('res.resultCode', res.resultCode);
        console.info('res.want', JSON.stringify(res.want));
      }); // 打开DLP权限管理应用
    } catch (err) {
      console.error('error', err.code, err.message); // 失败报错
    }
    

在这里插入图片描述

  1. 查询当前系统是否提供DLP特性。

    import { dlpPermission } from '@kit.DataLossPreventionKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    
    dlpPermission.isDLPFeatureProvided().then((res) => {
      console.info('res', JSON.stringify(res));
    }).catch((err: BusinessError) => {
      console.error('error', (err as BusinessError).code, (err as BusinessError).message); // 失败报错
    });
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/769171.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

8款你不一定知道的良心软件!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/我们使用一些流行的软件的时候&#xff0c;往往会忽略一些功能非常强大的软件&#xff0c;因为这些软件的众 多&#xff0c;都因为看不见而丢失&a…

【ACM出版-EI稳检索】第三届金融创新、金融科技与信息技术国际学术会议(FFIT 2024,7月26-28)

第三届金融创新、科技与信息技术国际学术会议&#xff08;FFIT 2024&#xff09;将于2024年07月26-28日于重庆举行。 FFIT2024 将围绕“金融创新”、"金融科技”与“信息技术”等相关最新研究领域&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、…

Vue3Echarts写关于温湿度统计的好看折线图

在项目统计界面&#xff0c;我们离不开对Echarts的使用&#xff0c;接下来是我在做项目过程中做的一个关于温湿度统计的好看折线图&#xff0c;统计的是温度蓝色和湿度绿色&#xff0c;它们还会有告警和断电&#xff0c;分别用橘黄色和红色区分&#xff0c;以下是示例&#xff…

CesiumJS【Basic】- #056 绘制纹理填充多边形(Entity方式)-使用shader

文章目录 绘制纹理填充多边形(Entity方式)-使用shader1 目标2 代码2.1 main.ts绘制纹理填充多边形(Entity方式)-使用shader 1 目标 使用Entity方式绘制绘制纹理填充多边形 - 使用shader 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium…

Linux系统中交叉编译opencv库

目标&#xff1a;将opencv进行交叉编译&#xff0c;使其能在rk3326板子上运行使用。 环境&#xff1a; ubuntu&#xff1a;18.04 opencv:4.5.4 opencv源码从挂网下载&#xff1a;opencv源码下载地址 交叉编译链&#xff1a;gcc-arm-10.3-linux-gun 一.环境准备 1.交叉编译链我…

【RT摩拳擦掌】如何构建RT AVB switchendpoint平台

【RT摩拳擦掌】如何构建RT AVB switch&endpoint平台 一&#xff0c;文档简介二&#xff0c;平台构建2.1 软硬件情况2.2 配置RT1170 AVB端点2.2.1 1块MIMXRT1170开发板做talker配置2.2.2 2块MIMXRT1170开发板做listener配置 2.3 AVB Switch 配置2.3.1 MOTU AVB Switch2.3.2 …

Ansys Zemax|场曲跟畸变图的前世今生

实现 OpticStudio通过在X和Y方向&#xff08;弧矢和子午方向&#xff09;的傍轴光线追踪确定近轴图像平面的Z坐标&#xff0c;并测量该近轴焦平面与系统图像平面的Z坐标之间的距离。 切向数据是沿Z轴从图像平面到近轴图像平面在切向&#xff08;YZ&#xff09;平面测量的距离…

【LeetCode刷题】3099.哈沙德数

题目链接 3099. 哈沙德数 - 力扣&#xff08;LeetCode&#xff09; 实现代码 int sumOfTheDigitsOfHarshadNumber(int x) {int sum 0;for(int temp x; temp; temp / 10)sum temp % 10;return x%sum ? -1 : sum; }

魔行观察-AI数据分析>>勒泰中心购物中心

摘要 本报告基于 魔行观察 搜集整理的数据&#xff0c;对勒泰中心购物中心的营业状态、商户构成、业态分布以及消费者评价进行了详细分析。 商场概览 勒泰中心是一个正常营业的购物中心&#xff0c;自2013年开业以来&#xff0c;已成为当地居民和游客的重要购物和休闲场所。…

3D一览通优化供应链协同,加速产品设计研发和上市

在现代企业管理中&#xff0c;供应链管理无疑占据着举足轻重的地位。它不仅是企业资源优化配置的基石&#xff0c;更是企业降低成本、提高效率、满足客户需求、保持市场竞争力的关键环节。对于工业企业来说&#xff0c;供应链的高效运作尤其重要。 然而&#xff0c;在实际操作…

一篇文章用python GUI构建学生管理系统

引言 通过使用Python&#xff0c;我们可以利用其简洁和功能强大的特性&#xff0c;结合Tkinter提供的GUI开发能力&#xff0c;快速构建一个直观且易于使用的学生管理系统。 准备工作 在开始之前&#xff0c;确保你的开发环境中已经安装了 PythonTkinter库 安装完成后&…

SQLServer:从数据类型 varchar 转换为 numeric 时出错。

1.工作要求 计算某两个经纬度距离 2.遇到问题 从数据类型 varchar 转换为 numeric 时出错。 3.解决问题 项目版本较老&#xff0c;使用SQLServer 2012 计算距离需执行视图&#xff0c;如下&#xff1a; SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO ALTER view vi_ord…

2024年迄今最热门的10款网络安全工具和产品

今年上半年&#xff0c;利用生成式人工智能&#xff08;GenAI&#xff09;的网络安全工具继续激增。许多供应商正在利用GenAI的功能来自动化安全运营中心&#xff08;SOC&#xff09;的工作&#xff0c;特别是在自动化日常活动方面&#xff0c;如收集威胁信息和自动创建查询。 …

Elasticsearch (1):ES基本概念和原理简单介绍

Elasticsearch&#xff08;简称 ES&#xff09;是一款基于 Apache Lucene 的分布式搜索和分析引擎。随着业务的发展&#xff0c;系统中的数据量不断增长&#xff0c;传统的关系型数据库在处理大量模糊查询时效率低下。因此&#xff0c;ES 作为一种高效、灵活和可扩展的全文检索…

Profibus DP主站转Modbus网关连接伺服与电机通讯

在工业自动化领域&#xff0c;将Profibus DP主站转Modbus网关&#xff08;XD-MDPBM20&#xff09;用于连接伺服与电机通讯是一种常见且重要的应用方式。当使用Profibus DP主站转Modbus网关&#xff08;XD-MDPBM20&#xff09;连接伺服与电机进行通讯时&#xff0c;可以参考以下…

强连通分量

强连通分量 强连通定义 有向图 G G G 的强连通是指 G G G 中任意两个节点都可以直接或间接到达。 下方两幅图都是强连通。一个特殊一点&#xff0c;任意两点都可以直接到达&#xff1b;一个则是最常见的强连通图。 特殊强连通图&#xff0c;任意两点都可以直接到达 常见的…

虚拟机启动失败 请进行修复 关闭hyper-v

场景 win11开启夜神模拟器时弹出此提示。点击关闭hyper-v并重启电脑后仍然不行。 解决方法 关闭 Windows安全中心 的 内存完整性 后重启电脑恢复正常。 补充 由于我这里除了会用到夜神模拟器&#xff0c;还会用到docker&#xff0c;而docker又依赖hyper-v&#xff0c;不…

YOLOv5初学者问题——用自己的模型预测图片不画框

如题&#xff0c;我在用自己的数据集训练权重模型的时候&#xff0c;在训练完成输出的yolov5-v5.0\runs\train\exp2目录下可以看到&#xff0c;在训练测试的时候是有输出描框的。 但是当我引用训练好的best.fangpt去进行预测的时候&#xff0c; 程序输出的图片并没有描框。根据…

【小白教学】-- 安装Ubuntu-20.04系统

下载 Ubuntu-20.04 镜像 具体如何下载镜像&#xff0c;请移驾我上一篇文章。使用清华大学开源镜像站下载。https://zhuanlan.zhihu.com/p/706444837 制作 Ubuntu-20.04 系统盘 安装软件 UltralSO 开始制作系统盘 第一步&#xff0c;插入一个 u 盘&#xff0c;启动软件&#x…

PO模式登录测试

项目实践 登陆项目测试 get_driver import page from selenium import webdriverclass GetDriver:driver Noneclassmethoddef get_driver(cls):if cls.driver is None:cls.driver webdriver.Edge()cls.driver.maximize_window()cls.driver.get(page.url)return cls.drivercl…