HarmonyOS应用程序访问控制探究

news2024/11/16 20:03:15

关于作者

白晓明

宁夏图尔科技有限公司董事长兼CEO、坚果派联合创始人

华为HDE、润和软件HiHope社区专家、鸿蒙KOL、仓颉KOL

华为开发者学堂/51CTO学堂/CSDN学堂认证讲师

开放原子开源基金会2023开源贡献之星

一、引言

随着信息技术的飞速发展,移动应用程序已经成为人们生活和工作中不可或缺的一部分。然而,随之而来的是对应用程序安全性的更高要求,尤其在用户隐私保护方面。工信部一直高度重视用户隐私保护,并依据《个人信息保护法》、《电信条例》、《规范互联网信息服务市场秩序若干规定》、《电信和互联网用户个人信息保护规定》等相关法律法规规章,对涉及用户隐私获取做出明确的通知,防止未经用户授权访问用户隐私信息以及用户隐私信息的滥用。

HarmonyOS的应用程序访问控制机制在这种背景下显得尤为重要,不仅可以保护用户的个人信息,还可以提高应用程序的安全性和可靠性,增强用户对应用程序的信任。HarmonyOS应用程序中,默认情况下,应用只能访问有限的系统资源,需要访问额外的系统数据(包括用户个人数据)和功能,应用必须以明确的方式对外提供接口来共享其数据或功能。通过访问控制机制,避免数据或功能被不当或恶意使用。

我将继续深入探究HarmonyOS应用程序访问控制的原理、方法和实践,为开发者和用户提供有益的参考。通过对HarmonyOS访问控制机制的探究,我们可以更好地理解其工作原理和优势,为开发更加安全可靠的应用程序提供指导。同时,我们也可以为用户提供更好的使用体验,让用户更加放心地使用HarmonyOS应用程序。

二、HarmonyOS应用程序访问控制的重要性

1)保护用户数据安全

在移动应用程序中,用户的数据往往包含敏感信息,如个人身份信息、财务信息等。如果应用程序没有有效的访问控制机制,这些数据可能会被恶意应用程序窃取或滥用。HarmonyOS的访问控制机制可以限制应用程序对用户数据的访问权限,从而保护用户数据的安全。HarmonyOS根据不同的授权方式,权限类型分为以下两种:

  • system_grant(系统授权):在该类型的权限许可下,应用被允许访问的数据不会涉及到用户或设备的敏感信息,应用被允许执行的操作对系统或者其他应用产生的影响可控。申请该权限的应用系统会在用户安装应用时,自动把相应权限授予应用。

  • user_grant(用户授权):在该类型的权限许可下,应用被允许访问的数据将会涉及到用户或设备的敏感权限,应用被允许执行的操作可能对系统或其他应用产生严重的影响。该类型权限不仅需要在安装包中申请权限,还需要在应用动态运行时,通过发送弹窗的方式请求用户授权。在用户手动允许授权后,应用才会真正获取相应的权限,从而成功访问操作目标对象。

2)防止应用程序滥用权限

一些应用程序可能会过度申请权限,从而获取用户的隐私信息或进行不必要的操作。HarmonyOS的访问控制机制可以对应用程序的权限进行严格管理,防止应用程序滥用权限。HarmonyOS提出了受限开放的权限,比如允许读写用户公共目录的音频文件ohos.permission.READ_AUDIO/WRITE_AUDIO,允许应用使用全局悬浮窗的能力ohos.permission.SYSTEM_FLOAT_WINDOW等权限,若特殊场景需要使用这些受限开放权限,则需要提供相关申请材料到应用市场申请相应权限证书通过后,才可以正常使用。

3)提高系统安全性

HarmonyOS的访问控制机制不仅可以保护用户数据的安全,还可以提高系统的安全性。通过限制应用程序的访问权限,可以防止恶意应用程序对系统进行攻击或破坏。

三、HarmonyOS应用程序访问控制的原理

1)应用权限

HarmonyOS采用了权限管理机制,对应用程序的访问权限进行严格控制。应用程序在安装时需要声明所需的权限,用户在安装应用程序时可以查看这些权限并决定是否授予。在运行时,系统会根据应用程序的权限声明和用户的授权情况,对应用程序的访问请求进行权限检查。

为了防止应用过度索取和滥用权限,HarmonyOS中基于APL(Ability Privilege Level,元能力权限等级)等级,配置了不同的权限开放范围。应用APL等级分为以下三个等级,等级依次提高。

APL级别说明
normal默认情况下,应用的APL等级都是normal等级。
system_basic该等级的应用服务提供系统基础服务。
system_core该等级的应用服务提供操作系统核心能力。应用APL等级不允许配置为system_core。

根据权限对于不同等级应用有不同的开放范围,权限APL等级对应分为以下三个等级,等级依次提高。

APL级别说明开放范围
normal允许应用访问超出默认规则的普通系统资源,如配置Wi-Fi信息、调用相机拍摄等。 这些系统资源的开放(包括数据和功能)对用户隐私以及其他应用带来的风险低。APL等级为normal及以上的应用。
system_basic允许应用访问操作系统基础服务(系统提供或者预置的基础功能)相关的资源,如系统设置、身份认证等。 这些系统资源的开放对用户隐私以及其他应用带来的风险较高。- APL等级为system_basic及以上的应用。 - 部分权限对normal级别的应用受限开放,需要额外申请。
system_core涉及开放操作系统核心资源的访问操作。这部分系统资源是系统最核心的底层服务,如果遭受破坏,操作系统将无法正常运行。- APL等级为system_core的应用。 - 仅对系统应用开放。

2)沙箱机制

HarmonyOS采用了沙箱机制,系统中运行的应用程序均部署在受限保护的沙箱中,通过沙箱的安全隔离机制,可以限制应用程序的不当行为(如应用间非法访问数据、篡改设备等)。沙箱环境中每个程序都拥有唯一的ID(TokenID),系统基于此ID识别与限制应用的访问行为,从而提高系统的安全性。同时,沙箱机制还可以防止应用程序之间的互相干扰,提高系统的稳定性。

3)系统控件

HarmonyOS提供了系统Picker、安全控件等临时授权的方式替代权限申请,在特定的场景中,应用无需向用户申请权限也可以临时访问受限资源,实现精准化权限管控,更好地保护用户隐私。

  • 系统Picker:由系统独立进程实现,在应用拉起Picker,并由用户操作Picker后,应用可以获取Picker返回的资源或结果。举例说明,当应用需要读取用户图片时,可通过使用照片Picker,在用户选择所需要的图片资源后,直接返回该图片资源,而不需要授予应用读取图片文件的权限。

  • 安全控件:由系统提供UI控件,应用在界面内集成对应控件,用户点击后,应用将获得临时授权,从而执行相关操作。举例说明,当应用需要分享当前位置时,可使用位置控件,用户点击后,将会在本次前台期间获得精准定位的授权,可以调用位置服务获取精准定位。当发生灭屏、应用切后台、应用退出等任一情况时,临时授权结束。

四、 HarmonyOS应用程序访问控制开发指南

1)选择申请权限的方式

  • 最小权限原则:即在应用开发初期,开发者应仔细分析应用的功能和业务逻辑,确定所需的权限,避免过度申请权限,以免引起用户的疑虑和不信任。

  • 动态申请权限:即在应用运行时,根据实际业务场景动态申请权限,提高用户体验,减少不必要的权限请求干扰。

在HarmonyOS中每个权限的权限等级、授权方式不同,申请权限的方式也不同,开发者在申请权限前,需要先根据应用权限列表和应用申请权限的方式(参见下表)查看能否申请目标权限。

权限类型授权方式操作路径
所有应用可申请system_grant声明权限 > 访问接口
所有应用可申请user_grant声明权限 > 向用户申请授权 > 访问接口
受限开放权限system_grant申请使用受限权限 > 声明权限 > 访问接口
受限开放权限user_grant申请使用受限权限 > 声明权限 > 向用户申请授权 > 访问接口

以位置服务(Location Kit)为例,应用需要检查是否已经获取用户授权访问设备位置信息,若未获取授权,可以向用户申请需要的位置权限。

权限名称权限级别授权方式说明
ohos.permission.LOCATIONnormaluser_grant允许应用获取设备位置信息。 需要与模糊位置权限一起申请。
ohos.permission.APPROXIMATELY_LOCATIONnormalUser_grant允许应用获取设备模糊位置信息。

2)声明权限

根据实际的业务需要确定需要的权限后,需要在module.json5配置文件的requestPermissions标签中声明位置服务(Location Kit)所需的权限。

{
  "module": {
    ...
    "requestPermissions": [
      {
        "name": "ohos.permission.LOCATION",	// 权限名称,为系统已定义的权限
        "reason": "$string:location_reason",	// 申请权限的原因,当申请权限为user_grant权限时该字段为必填
        "usedScene": {	// 用于描述权限使用场景,当申请权限为user_grant权限时该字段为必填
          "abilities": [
            "EntryAbility"
          ],
          "when": "inuse"	// 调用时机(inuse:使用时;always:始终)
        }
      },
      {
        "name": "ohos.permission.APPROXIMATELY_LOCATION",
        "reason": "$string:location_reason",
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when": "inuse"
        }
      }
    ]
  }
}

3)向用户申请授权封装

大多数应用程序都会根据业务需要向用户申请授权,可利用抽象理念将向用户申请授权代码封装成可复用的模块或组件。通过定义清晰的接口和规范,可以提高代码的可维护性和可扩展性,同时降低不同应用场景的适配难度。

在工程entry模块src/main/ets目录下创建common文件夹,用于存放工程需要的基础公共代码,比如常量类AppConstants、权限控制工具类PermissionUtil等。

common > utils目录创建ArkTS文件PermissionUtil,并使用export导出该类。

/**
 * @description 权限控制工具类
 * @author 白晓明
 */
export class PermissionUtil {
​
}

用户每次执行需要目标权限的操作时,应用都必须调用checkAccessToken()方法检查自身是否已经具有该权限,该方法返回已授权PERMISSION_GRANTED或未授权PERMISSION_DENIED。在PermissionUtil中添加静态方法checkPermissionGrant用于检查当前应用程序是否已经被授予权限。

/**
 * 校验应用是否被授予 {permission} 权限
 * @param permission
 * @returns
 */
static checkPermissionGrant(permission: Permissions): abilityAccessCtrl.GrantStatus {
  const atManager = abilityAccessCtrl.createAtManager();
  // 初始化grantStatus为未授权
  let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
  let tokenId: number = 0;
  try {
    // 获取应用程序的accessTokenID
    const bundleInfo: bundleManager.BundleInfo =
      bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
    const appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
    tokenId = appInfo.accessTokenId;
    // 校验应用是否被授予权限
    grantStatus = atManager.checkAccessTokenSync(tokenId, permission);
    console.log(`检查${permission}权限状态为:${grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED ? "未授权" : "已授权"}`);
  } catch (error) {
    const err = error as BusinessError;
    console.error(`检查${permission}权限异常:${JSON.stringify(err)}`);
    grantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
  }
  return grantStatus;
}

在校验应用是否被授予权限时,若未授权,需要调用requestPermissionsFromUser()方法动态向用户申请权限(指应用程序运行时向用户请求授权的过程)。在PermissionUtil中添加静态方法reqPermissionFromUser方法动态向用户申请授权。

/**
 * 动态申请权限
 * @param permissions
 * @returns 
 */
static async reqPermissionFromUser(permissions: Permissions[]): Promise<number[]> {
  console.log(`[AppLogger]动态申请权限开始`);
  const atManager = abilityAccessCtrl.createAtManager();
  let result: PermissionRequestResult = { permissions: [], authResults: [] };
  try {
    result = await atManager.requestPermissionsFromUser(context, permissions);
  } catch (error) {
    const err = error as BusinessError;
    console.error(`[AppLogger]动态申请权限异常:${JSON.stringify(err)}`);
  }
  return result.authResults;
}

4)在UI中向用户申请授权

import { abilityAccessCtrl, Permissions } from '@kit.AbilityKit'
import { PermissionUtil } from '../common/utils/PermissionUtil';
​
@Entry
@Component
struct Index {
​
  private locationPermissions: Permissions[] = [
    'ohos.permission.LOCATION',
    'ohos.permission.APPROXIMATELY_LOCATION'
  ];
​
  async aboutToAppear(): Promise<void> {
    // 校验是否被授予定位权限
    let flag: boolean = false;
    for (const permission of this.locationPermissions) {
      flag = false;
      const grantStatus: abilityAccessCtrl.GrantStatus = PermissionUtil.checkPermissionGrant(permission);
      if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
        flag = true;
      }
    }
    if (!flag) {  // 未授权,则弹出授权提示弹窗
      await PermissionUtil.reqPermissionFromUser(this.locationPermissions);
    }
  }
​
  build() {...}
}

5)效果预览

五、结论

HarmonyOS应用程序访问控制机制是保障用户数据安全和系统安全的重要手段。通过权限管理、沙箱机制、系统控件等多种方法,HarmonyOS可以有效地限制应用程序对系统资源的访问权限,防止应用程序滥用权限和恶意攻击。

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

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

相关文章

【C++】实现日期类相关接口

C语法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇 本篇将介绍实现日期类中众多接口&#xff0c;同时这其中涉及到很多知识&#xff0c;务必将类和对象相关内容掌握再来实现日期类…

【数据结构】详细介绍栈和队列,解析栈和队列每一处细节

目录 一. 栈 1. 栈的概念 2. 栈的实现 2.1 栈的结构 2.2 初始化栈 2.3 入栈 2.4 出栈 2.5 获取栈顶元素 2.6 获取栈中有效个数 2.7 判断栈是否为空 2.8 销毁栈 二. 队列 1. 队列的概念 2. 队列的实现 2.1 队列的结构 2.2 队列初始化 2.3 销毁队列 2.4 入…

聊聊适配器模式

目录 适配器模式概念 主要实现方式 主要组成 UML用例图 代码示例 生活场景 应用场景 适配器模式概念 适配器模式属于结构型设计模式&#xff0c;它的主要目的是将一个类的接口转换成客户端所期望的另一种接口形式&#xff0c;使得原本接口不兼容的类可以一起工作。 主…

【New SQL】 -- CockroachDB license change

1、CockroachDB 发布了修改开源协议的 releases 北京时间 2024-08-16 &#xff0c;CockroachDB 发布了修改开源协议的 releases。 原文链接&#xff1a;Licensing FAQs Evolving our self-hosted offering and license model CockroachDB License change (again) | Product T…

Kali Linux 定制化魔改 添加常见60渗透工具

项目地址&#xff1a;https://github.com/CuriousLearnerDev/kali-linux-kde-beautify 系统版本&#xff1a;kali linux 2024.1 固件类型&#xff1a;BIOS 用户: zss 密码: ss 完整版 系统压缩大小&#xff1a;18.8 GB 解出来&#xff1a;36.00GB 左右 系统版 系统压缩大小&…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 04路由协议的选择

本章要回答的问题&#xff1a; 路由是如何工作的?有哪些类型的路由协议?Clos 拓扑中的路由协议是如何工作的?什么是无编号接口&#xff0c;以及为什么无编号接口如此重要?如何确定最适合自己需求的路由协议? 路由概述 用最简单的话来说&#xff0c;路由是使用数据包的目…

DESeq2差异基因分析和批次效应移除

差异基因鉴定 基因表达标准化 不同样品的测序量会有差异&#xff0c;最简单的标准化方式是计算counts per million (CPM)&#xff0c;即原始reads count除以总reads数乘以1,000,000。 这种计算方式的缺点是容易受到极高表达且在不同样品中存在差异表达的基因的影响&#xff…

FunClip,音视频识别,自动化剪辑,文本校对,智能纠错,导出SRT

今天给大家介绍一个自动化剪辑项目——FunClip,该项目是由阿里开源的&#xff0c;可以识别音频、视频中的文字&#xff0c;一键剪辑和添加字幕。 FunClip是一款高效的自动化视频剪辑工具&#xff0c;它利用语音识别技术对视频内容进行分析。用户可以在识别结果中选择所需的文本…

重生奇迹MU 梦幻骑士 真正生而高贵的职业

作为重生奇迹MU梦幻骑士中真正生而高贵的职业&#xff0c;圣骑士是玩家们最为追捧的职业之一。在游戏内&#xff0c;圣骑士拥有着强大的防御和治疗能力&#xff0c;成为团队中不可或缺的存在。如果你正准备选择一个强大的职业&#xff0c;那么不妨考虑成为一名圣骑士&#xff0…

选择文件摆渡系统要遵守的“三要”和“三不要”原则

文件摆渡系统不仅可以实现企业网络隔离后的数据摆渡需求&#xff0c;同时也可以视作企业数据安全及网络安全建设的重要组成部分。文件摆渡系统的选择也很关键&#xff0c;在企业进行筛选时&#xff0c;应该遵守“三要”和“三不要”原则。 “三要”之一&#xff1a;要安全 文件…

MySQL对事务的支持

5.MySQL对事务的支持情况&#xff1a; 5.1. 查看存储引擎对事务的支持情况 &#xff1a; 1.SHOW ENGINES 命令来查看当前 MySQL 支持的存储引擎都有哪些&#xff0c;以及这些存储引擎是否支持事务2.下图可以能看出在 MySQL 中&#xff0c;只有InnoDB类型的存储引擎是支持事务…

轻松搞定 Java7 新特性,示例丰富

Java 7 是 Java 语言的一个主要版本&#xff0c;于 2011 年 7 月 28 日正式发布。 由 Sun Microsystems 开发并由 Oracle 公司发布的一个重要版本&#xff0c;它带来了许多新功能特性&#xff0c;增强了编程语言的能力和性能。 以下是一些 Java 7 的主要新功能特性&#xff1…

基于SSM的体育馆预约管理系统---附源码84196

摘 要 体育馆作为一个重要的运动场所&#xff0c;需要进行预约管理以保证资源的合理利用和场馆秩序的维护。传统的人工预约管理方式存在效率低、容易出错等问题&#xff0c;因此&#xff0c;在互联网高速发展的当下&#xff0c;需要设计和实现一个基于SSM的体育馆预约管理系统&…

关于LLC知识9

1、上图有多条增益曲线&#xff0c;是每种不同的输出负载都对应一条增益曲线&#xff0c;在f1时候每个曲线都汇聚一点&#xff0c;说明只要输出电压频率f1时&#xff0c;不论输出负载是多少&#xff0c;增益是一样的&#xff0c;不受负载影响G1&#xff08;Lr与Cr发生谐振&…

[单master节点k8s部署]21.EFK日志收集平台介绍

大型系统是一个分布式部署的架构&#xff0c;不同的服务模块部署在不同的服务器上&#xff0c;问题出现时&#xff0c;大部分情 况需要根据问题暴露的关键信息&#xff0c;定位到具体的服务器和服务模块&#xff0c;构建一套集中式日志系统&#xff0c;可以提高 定位问题的效率…

构建自己的语音助手

在我最近发布关于如何构建自己的 RAG 并在本地运行它的帖子之后。今天&#xff0c;我们更进一步&#xff0c;不仅实现了大型语言模型的对话能力&#xff0c;还增加了听力和口语能力。这个想法很简单&#xff1a;我们将创建一个语音助手&#xff0c;让人想起标志性钢铁侠电影中的…

基于asp.net的办公协同管理系统源码分享

今天给大家分享一个asp.net开发的webform框架的办公协同管理系统源码SQLserver数据库 1.主要功能 这个项目是帮助一个学生指导的毕业设计&#xff0c;包含用户登陆、用户管理、车辆 管理、文件管理、个人中心、后台管理、文件上传、人事管理、系统日志等 等模块。2.开发工具及…

【Django-vue-admin学习笔记】页面自动计算日期差额的方法

在许多应用场景中,尤其是在管理系统中,经常需要对日期进行动态计算和展示,以帮助用户了解关键日期的即时状态。例如,在学生宿舍管理系统中,显示学生的退宿倒计时可以帮助管理人员有效监控即将到期的宿舍安排,并及时进行必要的调整。这样的功能不仅提高了管理效率,也增加…

H5接入企微JS-SDK,使用wx.previewFile进行文件预览

最近上项目&#xff0c;需求是做一个附件预览并且可以进行保存到手机、用其他应用打开的需求的需求&#xff0c;用企微的JS-SDK的wx.previewFile就可以满足以上的需求了 详细的可以参考&#xff1a;企业微信官方文档 前端 1、在项目的index.html中添加&#xff1a;jweixin-1.2…

两种用MATLAB绘制色块的方法

绘制色块首先可以想到用填充像素的方式 % 定义图像的尺寸 imageSize 500;% 创建一个 imageSize x imageSize x 3 的矩阵&#xff0c;每个像素都是绿色 % RGB颜色模型中绿色的值为 [0, 1, 0] greenImage zeros(imageSize, imageSize, 3); greenImage(:, :, 2) ones(imageSiz…