HarmonyOS 鸿蒙Next中基于设备安全服务相关问题定位指导

HarmonyOS 鸿蒙Next中基于设备安全服务相关问题定位指导 设备安全服务为应用在设备上使用状态管理和检测,提供设备状态检测(DeviceVerify)、安全检测(SafetyDetect)、可信应用服务等项目,保护应用免受安全威胁,并确保应用数据的安全。

场景一:开发者需进行设备完整性检测,以判断设备环境是否安全,比如是否被越狱、被模拟等。

完整性检测的结果分为以下三类:

  • jailbreak:设备被越狱。
  • emulator:模拟器。
  • attack:设备被攻击。

具体的开发步骤和返回结果说明请参考完整性检测开发指导文档

遇到创建密钥失败如何处理

先根据日志信息拿到创建密钥失败的原因(错误码和报错信息),然后根据错误信息去做对应的分析处理,有以下两种情况:

a. 创建密钥失败报错failed: 201 Permission denied.

解决方案:

没有权限指的是没有进行AGC鉴权。

AGC鉴权是一个特定环境或系统中的访问控制机制。在设备安全服务中,确保系统的安全性是至关重要的,因此,在访问或启用相关服务之前进行身份验证和授权即需要先申请AGC鉴权,在AGC审核通过之后去开启对应服务的权限。

66.png

b. 创建证明密钥失败 ipc communication failed 1011500006。

解决方案:

启用可信服务后,需更新profile文件。业务方若无法确认是否已更换,可检查profile文件中是否包含关键字“com.huawei.service.device_security.XXX”。若未找到该字段,需在AGC平台重新下载并替换原有profile文件。若存在该字段,则表明当前的profile文件已更新。

68.png

69.png

完整性检测常见的几种崩溃处理方法

a. 出现 foreground timeout

解决方案:

生命周期 Load Active Inactive Terminate Connect Disconnect Restart Foreground Background
超时时间 10s 5s 0.5s 10s 3s 0.5s 5s 5s 3s

崩溃日志看MSG是Foreground超时导致。因为完整性检测的接口比较耗时,尽量不要放在onForeground等生命周期里面,具体的实现方案有如下两种:

i. 在onCreate函数里不要调用比较耗时的方法,如果耗时比较长可以考虑使用异步方法;在onCreate函数里请求可能会超时的接口时可以设置超时时间,超时时间应该小于5s。

ii. 也可以考虑把耗时的方法放在子线程处理。

b. 出现 User input does not respond

解决方案:

完整性检测涉及端云协同,检测一次端到端事件也差不多1.5-2秒的时间。该过程较耗时,业务方是把耗时操作放在了ui线程里导致奔溃。需要让业务方把耗时的操作放在另外的线程(不要放在ui里执行即可)

其他常见问题及解决方案:

Q1:完整性检测的时候返回的结果中Header(头部)、Payload(负载)、Signature(签名)这三个部分使用Base64URL编码后通过“.”进行连接,实际获取只有header,没有payload以及signature。

A1:是因为打印的时候数据太长,日志里一行打不完,需要换行或者写到文件中查看。

Q2:是否支持在模拟器使用安全检测?

A2:不支持在模拟器实现完整性检测。

Q3:系统完整性检测方法,总是返回 detail:[“attack”]。

A3:因为设备是解了fastboot锁的,所以会报attack。

场景二:设备真实性证明(服务端开发)

校验密钥证明信息。

a. 校验的作用是什么,如何校验keyManagerId?

设备证书服务支持向系统中多个TA提供密钥证明能力(设备真实性证明),目前开放给开发者使用的密钥证明能力是由HUKS提供的,这个keyManagerID是HUKS服务的ID。从安全性的角度考虑,建议业务校验这个ID。具体实现如下:

boolean checkAttestInfo(AttestationInfo attestInfo) { 
  //todo: 校验Challenge 
  System.out.println("challenge is:");
  printBytes(attestInfo.challenge); 
  //todo: 校验appid中的bundleName字段 
  System.out.println("appid is:\n " + attestInfo.appid); 
  //todo: 校验keyManagerId,固定为:0x28c4fb4944afec11b9090242ac120002 
  System.out.println("key manager id is:");
  printBytes(attestInfo.keyManagerId); 
  return true;
}

b. 注释写的是keyManagerId是一个固定值,代码开发中确实获取到的也是这个内容,不过获取到的是字节,应该如何校验?

对象是数组格式,可以转换成字符串校验,即转成十六进制字符串。

设备真实性证明获取证书。

a. 设备真实性证明获取证书要联网,因为需要和华为服务器校验,调用huks.anonAttestKeyItem获取证书。

b. 开发者应该在应用服务器中保存校验通过的应用公钥,在后续的业务请求中应用使用业务私钥进行签名,应用服务器使用应用公钥进行验签。请勿在每次的业务请求中都对应用公钥进行证明。因为当应用调用密钥证明接口时,Universal Keystore Kit都会调用华为服务器来执行认证,华为服务器可能会限制来自特定应用的认证流量,以避免在太多应用同时进行调用时出现过载,从而导致应用处理失败。

具体的开发流程可以参考:密钥证明和保存流程

场景三:可信服务 获取安全地理位置

安全地理位置特性

相对于普通定位,安全地理位置和普通位置就是加一个签名的区别,优点就是能防止被篡改,但是会导致其在性能上略有不足。

安全方面:

a. 硬件GPS和WIFI的数据从底层上报即传给TEE,保障数据源头的纯净。

b. 通过可新应用服务对地理位置信息进行签名,防止被非法分子篡改。

c. 应用获取安全地理位置后,对地理位置信息进行验签。

性能方面:

a. 耗时1s~1.5s左右,相比于普通地理位置稍微逊色,建议提前进行初始化。

b. 不能用于长时间的定位场景,一面长时间调用TEE签名,对性能消耗过大。

主要场景:

主要用于办公应用的打卡考勤&风控场景。

a. 通过集成安全地理位置,防止通过篡改地理位置虚假考勤。

b. 通过集成安全地理位置,确保交易更加可靠以及防止薅羊毛,可以有效降低风险。

c. 不可用于实时定位。

创建证明密钥信息时,出现 1011500000 的报错如何处理

解决方案:

在创建的密钥信息时原来的密钥还存在,就会导致新创建的密钥和之前创建的证明密钥冲突,需要在创建之前先调用一下destroyAttestKey()方法,把之前的证明密钥销毁后,再去执行创建证明密钥。

async function destroyAttestKey(): Promise<void> {
  try {
    //销毁证明密钥的实现 
    await trustedAppService.destroyAttestKey(); 
  } catch (err) {
    let error = err as BusinessError;
    Logger.error(TAG, Failed to destroy attest key: ${error.message}, code: ${error.code});
  }
}

其他常见问题及解决方案:

Q1:安全地理位置 速度优先和精度优先 更推荐哪个?

A1:如果选择精度优先策略,可信应用服务会优先返回GPS的结果,GPS获取超时后返回网络地理位置;而如果选择速度优先策略,可信应用服务会返回从二者中最先获取到的结果。根据具体的业务需要去选择。

Q2:如果是开发sdk,可信服务及证书是接入端申请还是sdk端申请

A2:可信服务及证书是接入端去申请的,接入端就是应用。

Q3:安全相机验证完证书链是否需要验证密钥信息?比如挑战值challenge在客户端没有传,会获取为空,如果需要验证,客户端应该怎么传?

A3:验证证书链验证其合法性即可,挑战值是服务器随机生成的,他在服务端也拿不到。另外匿名证书链是需要自动创建。

Q4:是否需要保存HarmonyOS Hap应用生成的公钥?文档会保存为.pem的格式

A4:可以不用保存,保存根证书即可,用根证书去验证密钥证书链。

Q5:后端验签的示例代码有待签名的数据,对应的是应用端的什么数据呢?不是很理解。实际场景是将安全图像以base64的方式传给后端,后端拿到这个base64串后做验签吗?如何做?

A5:将base64数据在服务端转成byte后和userData拼接使用。


更多关于HarmonyOS 鸿蒙Next中基于设备安全服务相关问题定位指导的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS鸿蒙Next中,基于设备安全服务的问题定位可通过日志分析、调试工具和系统监控实现。使用HiLog模块记录关键日志,通过DevEco Studio的调试功能检查代码执行路径。系统监控工具如dumpsys可获取设备状态信息。重点关注安全服务API的调用结果和异常处理逻辑,确保权限配置正确。

更多关于HarmonyOS 鸿蒙Next中基于设备安全服务相关问题定位指导的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS Next设备安全服务相关问题,以下是关键问题定位指导:

  1. 设备完整性检测问题:
  • 创建密钥失败201错误:需完成AGC鉴权流程,在开发者平台开启对应服务权限
  • IPC通信失败1011500006:检查profile文件是否包含"com.huawei.service.device_security"字段,未包含需重新下载更新
  1. 常见崩溃处理:
  • Foreground超时:避免在生命周期回调中执行耗时操作,建议:
    • 使用异步调用
    • 设置超时时间(<5s)
    • 移至子线程处理
  • UI线程阻塞:将完整性检测等耗时操作移至非UI线程
  1. 设备真实性证明:
  • 密钥证明需联网完成华为服务器校验
  • 服务端应缓存已验证的应用公钥,避免频繁校验
  • keyManagerId校验需转换为十六进制字符串比对固定值
  1. 安全地理位置:
  • 特性:TEE保障数据源可信,1-1.5s响应时间
  • 适用场景:考勤打卡、风控等防篡改场景
  • 1011500000错误:创建新密钥前需调用destroyAttestKey()清除旧密钥
  1. 其他注意事项:
  • 完整性检测不支持模拟器环境
  • fastboot解锁设备会返回attack状态
  • 证书链验证只需验证根证书合法性
  • 安全图像验签需将base64数据转为byte后拼接userData

建议开发者参考对应场景的官方开发指导文档实现具体功能,注意各服务的性能特点和适用场景。

回到顶部