目录

1 系统特性

1. 基于可信执行环境TEE提供系统完整性检测结果:在设备安全启动时,在TEE中评估检测系统完整性,可信度高,并动态评估系统完整性。

2. 系统完整性检测结果安全可信:系统完整性检测结果请求证书签名;服务端使用X.509数字证书对系统完整性检测结果签名,使用JWS格式回传给系统完整性检测API,签名结果不可篡改。

2 产品概述

                                              

(1)第三方应用APP集成HMS SDK调用Safety Detect service。

(2)请求TSMS服务器签名检测结果。

(3)第三方应用APP请求自己服务检测结果。

3 典型场景

应用需要检测系统完整性时,调用系统完整性检测API,检测系统完整性是否被破坏,针对不安全设备采取相应的措施。

4 开发流程

请参考:开发流程

5 应用开发

5.1 检查 HMS版本

使用 Safety Detect SysIntegrity API 之前,必须确保在用户设备上安装了正确版本的 HMS 服务。如果安装了不正确的版本,则您的应用可能会在调用 API 后停止响应。如果您的应用检测到安装了错误的版本,则应要求用户在其设备上更新 HMS。

要检查已安装的 HMS 版本是否与您使用的 Android SDK 版本兼容,请调用 isHuaweiMobileServicesAvailable() 方法,如以下代码片段所示:

  1. if (HuaweiApiAvailability.getInstance().isHuaweiMobileServicesAvailable(context)== ConnectionResult.SUCCESS){
  2.    // The SafetyDetect SysIntegrity API is available.
  3. } else {
  4.    // Prompt user to update HMS.
  5. }


5.2 调用 Safety Detect SysIntegrity

在HUAWEI开发者联盟中创建应用并配置签名证书指纹之后,您的应用可以使用Safety Detect SysIntegrity Service。请完成以下步骤:

1.获取 nonce;

2.请求 Safety Detect SysIntegrity;

3.在您的服务器中验证检测结果(签名,证书链,域名)。

5.3 获取 nonce

在调用 Safety Detect SysIntegrity API 时,您必须传入一个 nonce 值。在检测结果中会包含这个 nonce 值,您可以通过校验这个 nonce 值来确定返回结果能够对应您的请求,并且没有被重放攻击。

说明:
一个 nonce 值只能被使用一次,nonce 值必须至少为 16字节。推荐的做法是从发送到您的服务器的数据中派生 nonce 值。比如,使用用户名加当前时间戳作为 nonce 值。

5.4 请求 Safety Detect SysIntegrity

Safety Detect SysIntegrity 接口有两个参数,第一个是上一小节我们获取的 nonce 值,第二个是 appId。在开发准备中,您已经创建了一个应用,在配置签名证书指纹步骤中,您已经可以在开发者联盟的网页上获取 appId 了,将 appId 作为第二个参数传入接口:

  1. private void invokeSysIntegrity() {
  2.    SafetyDetectClient mClient = SafetyDetect.getClient(Mainactivity.this);
  3.    // TODO(developer): Change the nonce generation to include your own, used once value,
  4.    // ideally from your remote server.
  5.    byte[] nonce = ("Sample" + System.currentTimeMillis()).getBytes();
  6.    Task task = mClient.sysIntegrity(nonce,"3*******");
  7.    task.addOnSuccessListener(new OnSuccessListener<SysIntegrityResp>() {
  8.        @Override
  9.        public void onSuccess(SysIntegrityResp response) {
  10.            // Indicates communication with the service was successful.
  11.            // Use response.getResult() to get the result data.
  12.            String jwsStr = response.getResult();
  13.        }
  14.    }).addOnFailureListener(new OnFailureListener() {
  15.        @Override
  16.        public void onFailure(Exception e) {
  17.            // An error occurred while communicating with the service.
  18.            if (e instanceof ApiException) {
  19.                // An error with the HMS API contains some
  20.                // additional details.
  21.                ApiException apiException = (ApiException) e;
  22.                // You can retrieve the status code using
  23.                // the apiException.getStatusCode() method.
  24.                Log.e(TAG, "Error: " + SafetyDetectStatusCodes.getStatusCodeString(apiException.getStatusCode()) + ": " + apiException.getMessage());
  25.            } else {
  26.                // A different, unknown type of error occurred.
  27.                Log.e(TAG, "ERROR:" + e.getMessage());
  28.            }
  29.        }
  30.    });
  31. }

5.5 在您的服务器中验证检测结果

HMS将帮助你将验证结果发送到华为服务器校验证书的准确性并将完成校验的结果通过SysIntegrityResp返回,使用此对象的getResult()方法获取响应,格式为JSON WEB签名(JWS)

1. 解析JWS,获取header,payload,signature;

2. 从header中获取证书链,使用HUAWEI CBG root证书对其进行验证;

3. 校验证书链中的叶证书域名,域名:sysintegrity.platform.hicloud.com;

4. 从signature中获取签名,校验其签名;

5. 从payload中获取完整性验证结果,格式和样例摘录如下:

  1. {
  2.    "advice":"RESTORE_TO_FACTORY_ROM",
  3.    "apkCertificateDigestSha256":[
  4.        "yT5JtXRgeIgXssx1gQTsMA9GzM9ER4xAgCsCC69Fz3I="
  5.    ],
  6.    "apkDigestSha256":"6Ihk8Wcv1MLm0O5KUCEVYCI/0KWzAHn9DyN38R3WYu8=",
  7.    "apkPackageName":"com.huawei.hms.safetydetectsample",
  8.    "basicIntegrity":false,
  9.    "nonce":"R2Rra24fVm5xa2Mg",
  10.    "timestampMs":1571708929141
  11. }

当检测结果中 basicIntegrity 为false ,开发者可以根据自身功能对安全的要求决定是否提醒用户。

说明:

具体字段解释请参见 Huawei SafetyDetect API Index,注:

校验逻辑请获取示例代码,请下载SafetyDetect-SysIntegrity-Sample.zip。

下载Huawei CBG Root CA.zip证书。