鸿蒙中Ability的合法性校验机制

本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

在鸿蒙(HarmonyOS)中,Ability的合法性校验是确保应用间安全交互的核心机制,主要通过签名校验、权限控制、Want参数验证等多层防护实现。以下是详细的校验流程和具体实现方式:

一、合法性校验的核心机制

1. 签名校验(Bundle校验)
  • 校验时机:当应用通过startAbility启动其他Ability时。
  • 校验内容
    • Bundle证书链:验证目标应用的签名证书是否由华为官方或可信CA签发。
    • 签名哈希匹配:检查目标Ability所属应用的签名与发布时一致。
const want: Want = {
  bundleName: 'com.example.target', // 目标应用Bundle名称
  abilityName: 'TargetAbility',
  certificateFingerprint: 'SHA256:xxxx', // 可选:指定签名指纹
};
context.startAbility(want).catch((err: BusinessError) => {
  if (err.code === 201) console.error('签名校验失败');
});
  • 失败场景:若目标应用被篡改或签名不一致,系统返回错误码 201
2. 权限控制(Permission校验)
  • 静态权限:在module.json5中声明所需权限:
{
  "requestPermissions": [
    {
      "name": "ohos.permission.START_ABILITIES",
      "reason": "需要启动其他Ability"
    }
  ]
}

动态权限:敏感操作需运行时申请: 

import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
const atManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(['ohos.permission.START_ABILITIES'])
  .then((result) => {
    if (result.authResults[0] === 0) {
      context.startAbility(want); // 权限通过后启动
    }
  });
3. Want参数过滤
  • 显式启动:必须精确指定bundleNameabilityName
  • 隐式启动:通过actionsentities匹配时,系统会过滤不符合条件的Ability:
const want: Want = {
  action: 'ohos.want.action.viewData',
  entities: ['entity.system.browsable']
};
4. 进程隔离与沙箱校验
  • 跨进程调用:通过Binder IPC通信时,内核层会验证调用方UID/GID是否合法。
  • 沙箱限制:每个Ability运行在独立沙箱中,无法直接访问其他应用的数据目录。

二、校验流程的底层实现

1. 系统服务参与
  • AbilityManagerService (AMS):负责校验Ability是否存在、权限是否满足。
  • BundleManagerService (BMS):验证Bundle签名和证书链。
2. Native层校验逻辑
  • 源码路径foundation/ability/ability_runtime/services/abilitymgr/
  • 关键函数
// 校验签名和权限
ErrCode AbilityManagerService::VerifyCallingPermission(const Want &want) {
  if (CheckAppSignature(want.GetBundleName()) != SUCCESS) {
    return ERR_PERMISSION_DENIED; // 签名不匹配
  }
  if (CheckCallerPermission() != SUCCESS) {
    return ERR_PERMISSION_DENIED; // 权限不足
  }
  return SUCCESS;
}
3. 安全审计日志
  • 校验失败时,系统会记录安全日志(可通过hilog查看):
hdc shell hilog | grep 'AbilityVerify'
# 输出示例:E 01-02 15:00:00.000 100 1000 AbilityVerify: Signature mismatch for com.example.target

三、调试与验证方法

1. 强制跳过校验(仅调试)

config.json中临时关闭校验(禁止上架时使用):

{
  "app": {
    "debug": true, // 调试模式下放宽部分校验
    "bundleName": "com.example.debug"
  }
}
2. 签名校验工具

使用命令行手动验证应用签名:

hdc app install --check-signature /path/to/app.hap
# 输出示例:Success: Signature valid
3. 权限检查命令

查看当前应用的权限授予状态:

hdc shell aa dump -a com.example.demo | grep 'grantedPermissions'

四、常见校验失败场景与解决

错误码原因解决方案
201签名不匹配或证书失效检查目标应用的签名证书是否更新
202权限未授予动态申请权限或修改module.json5
203Want参数无法匹配到目标确认abilityNameaction是否正确

五、建议

  1. 发布前全面测试
    • 使用华为官方签名证书,并在真机上验证跨Ability调用。
  2. 最小权限原则
    • 仅申请必要的权限,降低安全风险。
  3. 敏感操作加密
    • 对跨Ability传递的数据使用@ohos.security.crypto加密。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值