基于设备安全服务相关问题定位指导
设备安全服务为应用在设备上使用状态管理和检测,提供设备状态检测(DeviceVerify)、安全检测(SafetyDetect)、可信应用服务等项目,保护应用免受安全威胁,并确保应用数据的安全。
场景一:开发者需进行设备完整性检测,以判断设备环境是否安全,比如是否被越狱、被模拟等。
完整性检测的结果分为以下三类:
- jailbreak:设备被越狱。
- emulator:模拟器。
- attack:设备被攻击。
具体的开发步骤和返回结果说明请参考完整性检测开发指导文档。
- 遇到创建密钥失败如何处理
先根据日志信息拿到创建密钥失败的原因(错误码和报错信息),然后根据错误信息去做对应的分析处理,有以下两种情况:
- 创建密钥失败报错failed: 201 Permission denied.
解决方案:
没有权限指的是没有进行AGC鉴权。
AGC鉴权是一个特定环境或系统中的访问控制机制。在设备安全服务中,确保系统的安全性是至关重要的,因此,在访问或启用相关服务之前进行身份验证和授权
即需要先申请AGC鉴权,在AGC审核通过之后去开启对应服务的权限。
- 创建证明密钥失败 ipc communication failed 1011500006。
解决方案:
启用可信服务后,需更新profile文件。业务方若无法确认是否已更换,可检查profile文件中是否包含关键字“com.huawei.service.device_security.XXX”。若未找到该字段,需在AGC平台重新下载并替换原有profile文件。若存在该字段,则表明当前的profile文件已更新。
- 创建密钥失败报错failed: 201 Permission denied.
- 完整性检测常见的几种崩溃处理方法
- 出现 foreground timeout
解决方案:生命周期
Load
Active
Inactive
Terminate
Connect
Disconnect
Restart
Foreground
Background
超时时间
10s
5s
0.5s
10s
3s
0.5s
5s
5s
3s
- 在onCreate函数里不要调用比较耗时的方法,如果耗时比较长可以考虑使用异步方法;在onCreate函数里请求可能会超时的接口时可以设置超时时间,超时时间应该小于5s。
- 也可以考虑把耗时的方法放在子线程处理。
- 出现 User input does not respond
解决方案:
完整性检测涉及端云协同,检测一次端到端事件也差不多1.5-2秒的时间。该过程较耗时,业务方是把耗时操作放在了ui线程里导致奔溃 。需要让业务方把耗时的操作放在另外的线程(不要放在ui里执行即可)
- 出现 foreground timeout
- 其他常见问题及解决方案:
Q1:完整性检测的时候返回的结果中Header(头部)、Payload(负载)、Signature(签名)这三个部分使用Base64URL编码后通过“.”进行连接,实际获取只有header,没有payload以及signature。
A1:是因为打印的时候数据太长,日志里一行打不完,需要换行或者写到文件中查看。
Q2:是否支持在模拟器使用安全检测?
A2:不支持在模拟器实现完整性检测。
Q3:系统完整性检测方法,总是返回 detail:["attack"]。
A3:因为设备是解了fastboot锁的,所以会报attack。
场景二:设备真实性证明(服务端开发)
- 校验密钥证明信息。
- 校验的作用是什么,如何校验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; }
- 注释写的是keyManagerId是一个固定值,代码开发中确实获取到的也是这个内容,不过获取到的是字节,应该如何校验?
对象是数组格式,可以转换成字符串校验,即转成十六进制字符串。
- 校验的作用是什么,如何校验keyManagerId?设备证书服务支持向系统中多个TA提供密钥证明能力(设备真实性证明),目前开放给开发者使用的密钥证明能力是由HUKS提供的,这个keyManagerID是HUKS服务的ID。从安全性的角度考虑,建议业务校验这个ID。具体实现如下:
- 设备真实性证明获取证书。
- 设备真实性证明获取证书要联网,因为需要和华为服务器校验,调用huks.anonAttestKeyItem获取证书。
- 开发者应该在应用服务器中保存校验通过的应用公钥,在后续的业务请求中应用使用业务私钥进行签名,应用服务器使用应用公钥进行验签。请勿在每次的业务请求中都对应用公钥进行证明。因为当应用调用密钥证明接口时,Universal Keystore Kit都会调用华为服务器来执行认证,华为服务器可能会限制来自特定应用的认证流量,以避免在太多应用同时进行调用时出现过载,从而导致应用处理失败。
具体的开发流程可以参考:密钥证明和保存流程。
场景三:可信服务(Consulting description) 获取安全地理位置
- 安全地理位置特性
相对于普通定位,安全地理位置和普通位置就是加一个签名的区别,优点就是能防止被篡改,但是会导致其在性能上略有不足。
安全方面:
- 硬件GPS和WIFI的数据从底层上报即传给TEE,保障数据源头的纯净。
- 通过可新应用服务对地理位置信息进行签名,防止被非法分子篡改。
- 应用获取安全地理位置后,对地理位置信息进行验签。
性能方面:
- 耗时1s~1.5s左右,相比于普通地理位置稍微逊色,建议提前进行初始化。
- 不能用于长时间的定位场景,一面长时间调用TEE签名,对性能消耗过大。
主要场景:
主要用于办公应用的打卡考勤&风控场景。
- 通过集成安全地理位置,防止通过篡改地理位置虚假考勤。
- 通过集成安全地理位置,确保交易更加可靠以及防止薅羊毛,可以有效降低风险。
- 不可用于实时定位。
- 创建证明密钥信息时,出现 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拼接使用。
更多推荐
所有评论(0)