鸿蒙数据防泄漏(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; // 获取当前UIAbilityContextlet 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); // 失败报错
    });
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在主动动态安全中使用人工智能驱动的威胁分类提高防御精准度

面对当今世界不断演变的网络威胁&#xff0c;人工智能和网络安全将会发挥重要的防护作用。在数据泄露和网络攻击日益突出的时代&#xff0c;人工智能和网络安全之间的合作成为数字安全战场上的强大盟友。 本文将深入研究这两个领域的融合&#xff0c;揭示它们在彻底改变威胁检测…

C - Tile Distance 2

分析&#xff1a;每穿过一行就会加一 先纵向走&#xff0c;再横向走 统一用砖头的左半部分计算 #include<bits/stdc.h> using namespace std; typedef long long ll; int main(){ ll sx,sy,tx,ty;cin>>sx>>sy>>tx>>ty; if((sxsy)%2!0)…

远程登录WINDOWS10,提示你的凭据不工作

1&#xff1a;想通过远程桌面登录WINDOWS10输入用户名和密码后&#xff0c;出现下面的提示。 2&#xff1a;登录WINDOWS10&#xff0c;在运行中输入gpedit.msc 3&#xff1a;本地组策略编辑器窗口中&#xff0c;依次展开&#xff0c;计算机配置 ---> 管理模版---> 系统--…

生成式人工智能与虚拟资产成为BGOV 2024的焦点议题

香港&#xff0c;2024年7月2日 — 一年一度的创新科技盛事BUSINESS GOVirtual (BGOV) 科技博览及会议将于2024年7月11日至12日在香港会议展览中心隆重举行。 展览及会议焦点两大科技趋势&#xff1a;生成式人工智能 (Generative AI) 和虚拟资产 生成式人工智能( Generative A…

鸿蒙数据防泄漏(DLP)【Data Loss Prevention Kit简介】

Data Loss Prevention Kit简介 Data Loss Prevention Kit&#xff08;数据防泄漏服务&#xff0c;简称为DLP&#xff09;&#xff0c;是系统提供的系统级的数据防泄漏解决方案&#xff0c;提供文件权限管理、加密存储、授权访问等能力&#xff0c;数据所有者可以基于帐号认证对…

Android线性布局的概念与属性

线性布局(LinearLayout)是Android中最简单的布局方式&#xff0c;线性布局方式会使得所有在其内部的控件或子布局按一条水平或垂直的线排列。如图所示&#xff0c;图a是纵向线性布局示意图&#xff0c;图b是横向线性布局示意图。 a&#xff09;纵向线性布局示意图 …

【计算机视觉系列实战教程 (十四)】:图像金字塔(高斯金字塔、拉普拉斯金字塔)

1.图像金字塔 (1)下采样 从G0 -> G1、G2、G3 step01&#xff1a;对图像Gi进行高斯核卷积操作&#xff08;高斯滤波&#xff09;step02&#xff1a;删除所有的偶数行和列 void cv::pyrDown(cv::Mat &imSrc, //输入图像cv::Mat &imDst, //下采样后的输出图像cv::Si…

在SpringBoot 3.0环境下创建一个SpringBoot 项目

一、环境配置 1.专业版的IDEA 版本号&#xff1a;尽量选择不要太老&#xff0c;不要太早 这里以2023.3.1为例。 官网&#xff1a;Download IntelliJ IDEA – The Leading Java and Kotlin IDE (jetbrains.com) 破解版&#xff1a;网上找资料哦&#xff01;&#xff01;&#…

《人生苦短,我用python·七》各种报错问题解决及C++调用python的接口

1、VS的debug版本正常可以调用python的release版本&#xff08;python安装完只有release版本的dll和lib&#xff09;&#xff0c;在项目——附加依赖项中加入python39.lib然后编译debug版本报错&#xff0c;无法打开python39_d.lib&#xff0c;我在项目属性配置的是调用release…

程序员学长 | 当 LSTM 遇上 Attention

本文来源公众号“程序员学长”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;当 LSTM 遇上 Attention 今天我们一起来聊一下深度学习中的注意力&#xff08;Attention&#xff09;机制 注意力机制是深度学习中引入的一种技术&am…

「前端」快速排序算法演示

快速排序算法演示。 布局描述 一个简单的HTML页面,用户可以在其中输入一系列用逗号分隔的数字。 一个CSS样式表,提供了一个美观大方的布局和样式。 一个JavaScript脚本,实现了快速排序算法,并在用户点击按钮时对输入的数字进行排序,并显示结果。 效果演示 核心代码 <…

Mysql-基础-DDL操作

1、数据库操作 查询 查询所有数据库 show databases; 创建 创建数据库 create database [if not exists] 数据库名 使用及查询 use 数据库名 select database() 查询当前所处数据库 删除 drop database [if not exists] 数据库名 2、表操作 查询当前库中的所…

【ArcGIS Pro 加载项】修复图层名为要素类别名

ArcPro从目录添加要素类至内容列表&#xff0c;图层名称默认为要素类别名。 但是一番操作之后&#xff0c;这个图层名称可能会被你改了&#xff0c;想复原的话就要手动去图层属性里面复制要素类名称或者别名来重命名了&#xff0c;多少有点不方便。 所以小编通过SDK制作了这个…

python3.8安装详细教程

python3.8下载及安装详细教程 Python 3.8 是一个重要的Python版本&#xff0c;它引入了一系列新功能和改进。以下是对Python 3.8的详细概述&#xff0c;包括其关键特性、安装方法以及版本状态等信息。 Python 3.8的关键特性 海象运算符&#xff08;Walrus Operator&#xff09…

工程文件参考——CubeMX+LL库+SPI主机 阻塞式通用库

文章目录 前言CubeMX配置SPI驱动实现spi_driver.hspi_driver.c 额外的接口补充 前言 SPI&#xff0c;想了很久没想明白其DMA或者IT比较好用的方法&#xff0c;可能之后也会写一个 我个人使用场景大数据流不多&#xff0c;如果是大批量数据交互自然是DMA更好用&#xff0c;但考…

reggie外卖优化

文章目录 一、redis缓存1.1 缓存验证码1.2 缓存菜品数据 二、spring-cache 一、redis缓存 1.1 缓存验证码 不用sesiion&#xff0c;而使用redis来存放验证码。 首先在用户请求验证码&#xff0c;将验证码保存在sesion中&#xff0c;当登录成功之后&#xff0c;将redis中的验证…

Tekla Structures钢结构详图设计软件下载;Tekla Structures高效、准确的合作平台

Tekla Structures&#xff0c;它不仅集成了先进的三维建模技术&#xff0c;还融入了丰富的工程实践经验&#xff0c;为设计师、工程师和建筑商提供了一个高效、准确的合作平台。 在建筑项目的整个生命周期中&#xff0c;Tekla Structures都发挥着举足轻重的作用。从规划阶段开始…

录音转文字软件免费版哪个好?6个转文字工具让你轻松记录

随着小暑的到来&#xff0c;炎热的天气容易让人心浮气躁&#xff0c;影响工作效率。 在这个季节里&#xff0c;掌握一些办公技巧尤为关键。尤其是当我们需要整理会议记录或讲座内容时&#xff0c;如果能有一种方法&#xff0c;可以迅速将那些冗长的录音转换成清晰的文字&#…

使用Retrofit2+OkHttp监听上传或者下载进度会执行两次的问题

使用Retrofit2OkHttp监听上传或者下载进度RequestBody#writeTo/ResponseBody#source 会执行两次的问题 example&#xff1a; 问题原因&#xff1a; 使用了HttpLoggingInterceptor拦截器&#xff0c;并且日志等级为HttpLoggingInterceptor.Level.BODY 问题解决&#xff1a;

一个opencv实现检测程序

引言 图像处理是计算机视觉中的一个重要领域&#xff0c;它在许多应用中扮演着关键角色&#xff0c;如自动驾驶、医疗图像分析和人脸识别等。边缘检测是图像处理中的基本任务之一&#xff0c;它用于识别图像中的显著边界。本文将通过一个基于 Python 和 OpenCV 的示例程序&…