简介

        关键资产存储服务(ASSET),提供了用户短敏感数据的安全存储及管理能力。其中,短敏感数据可以是密码类(账号/密码)、Token类(应用凭据)、其他关键明文(如银行卡号)等长度较短的用户敏感数据。关键资产存储服务仅提供短敏感数据(不超过1KB)的安全存储能力,如业务希望对超长的数据提供保护时,请考虑使用通用密钥库系统加解密算法库框架保护您的数据。

 

使用场景

 

一、保护密码类数据

说明:

密码类数据可以是密码、登录令牌、信用卡号等用户敏感数据。

场景描述

用户在应用/浏览器中登录账号时,可以选择“记住密码”(如图)。针对此种场景,应用/浏览器可以将用户密码存储在ASSET中,由ASSET保证用户密码的安全性。

用户再次打开登录界面时,应用/浏览器可以从ASSET中查询用户密码,并将其自动填充到密码输入框,用户只需点击“登录”按钮即可完成账号登录,极大地提升了用户体验。

关键流程

业务调用ASSET保护密码类数据(后文统称为“关键资产”),可以参照以下流程进行开发。

 

 

二、保护需要用户认证的密码类数据

说明:

密码类数据可以是密码、登录令牌、信用卡号等用户敏感数据。

场景描述

用户在金融/银行类应用中查看银行卡号时,需要核实用户身份为持卡人本人。针对此种场景,应用可以将银行卡号存储到ASSET中,同时设置访问银行卡号需要用户身份认证。

用户查看银行卡号时,应用请求用户进行身份认证(比如通过验证锁屏密码或生物特征),身份校验通过后,应用查询并向用户展示银行卡号,极大地提升了用户安全体验。

关键流程

业务调用ASSET保护需要用户认证的关键资产,可以参照以下流程进行开发。

说明:

由于统一用户认证(UserIAM)只提供ArkTS接口,故本场景只支持使用ArkTS语言开发。

 

 

API接口源码分析

一、新增关键资产(C/C++)

可通过API文档查看新增关键资产的接口OH_Asset_Add的详细介绍。

在新增关键资产时,关键资产属性的内容参数如下表所示:

注意:

下表中名称包含“ASSET_TAG_DATA_LABEL”的关键资产属性,用于存储业务自定义信息,其内容不会被加密,请勿存放个人数据。

属性名称(Asset_Tag)属性内容(Asset_Value)是否必选说明
ASSET_TAG_SECRET类型为uint8[],长度为1-1024字节。必选关键资产明文。
ASSET_TAG_ALIAS类型为uint8[],长度为1-256字节。必选关键资产别名,每条关键资产的唯一索引。
ASSET_TAG_ACCESSIBILITY类型为uint32_t,取值范围详见Asset_Accessibility可选基于锁屏状态的访问控制。
ASSET_TAG_REQUIRE_PASSWORD_SET类型为bool。可选是否仅在设置了锁屏密码的情况下,可访问关键资产。
ASSET_TAG_AUTH_TYPE类型为uint32_t,取值范围详见Asset_AuthType可选访问关键资产所需的用户认证类型。
ASSET_TAG_SYNC_TYPE类型为uint32_t,取值范围详见Asset_SyncType可选关键资产支持的同步类型。
ASSET_TAG_IS_PERSISTENT类型为bool。可选在应用卸载时是否需要保留关键资产。
注意: 设置此属性时,需申请权限ohos.permission.STORE_PERSISTENT_DATA。
ASSET_TAG_DATA_LABEL_CRITICAL_1类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且有完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_CRITICAL_2类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且有完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_CRITICAL_3类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且有完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_CRITICAL_4类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且有完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_NORMAL_1类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_NORMAL_2类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_NORMAL_3类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_NORMAL_4类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_112+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_212+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_312+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_412+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
ASSET_TAG_CONFLICT_RESOLUTION类型为uint32_t,取值范围详见Asset_ConflictResolution可选新增关键资产时的冲突(如:别名相同)处理策略。

约束和限制

  • 基于别名的访问

    关键资产以密文的形式存储在ASSET数据库中,以业务身份 + 别名作为唯一索引。故业务需要保证每条关键资产的别名唯一。

  • 业务自定义数据存储

    ASSET为业务预留了12个关键资产自定义属性,名称以"ASSET_TAG_DATA_LABEL"开头。对于超过12个自定义属性的情况,业务可以将多段数据按照一定的格式(如JSON)拼接到同一个ASSET属性中。

    ASSET对部分属性会进行完整性保护,这部分属性名称以"ASSET_TAG_DATA_LABEL_CRITICAL"开头,且写入后不支持更新。

代码调用关系

base/security/asset/interfaces/kits/c/src/asset_api.c  :int32_t OH_Asset_Add(const Asset_Attr *attributes, uint32_t attrCnt)

调用

base/security/asset/interfaces/inner_api/c/src/asset_system_api.c :int32_t AssetAdd(const AssetAttr *attributes, uint32_t attrCnt)

调用

base/security/asset/interfaces/inner_api/c/src/asset_system_api.c : int32_t add_asset(const AssetAttr *attributes, uint32_t attr_cnt);

代码示例

1、新增一条密码是demo_pwd,别名是demo_alias,附属信息是demo_label的数据,该数据在用户首次解锁设备后可被访问。

2、在CMake脚本中链接相关动态库:target_link_libraries(entry PUBLIC libasset_ndk.z.so)

 

3、

#include <string.h>

#include "asset/asset_api.h"

void AddAsset() {
   static const char *SECRET = "demo_pwd";
   static const char *ALIAS = "demo_alias";
   static const char *LABEL = "demo_label";

   Asset_Blob secret = { (uint32_t)(strlen(SECRET)), (uint8_t *)SECRET };
   Asset_Blob alias = { (uint32_t)(strlen(ALIAS)), (uint8_t *)ALIAS };
   Asset_Blob label = { (uint32_t)(strlen(LABEL)), (uint8_t *)LABEL };
   Asset_Attr attr[] = {
      { .tag = ASSET_TAG_ACCESSIBILITY, .value.u32 = ASSET_ACCESSIBILITY_DEVICE_FIRST_UNLOCKED },
      { .tag = ASSET_TAG_SECRET, .value.blob = secret },
      { .tag = ASSET_TAG_ALIAS, .value.blob = alias },
      { .tag = ASSET_TAG_DATA_LABEL_NORMAL_1, .value.blob = label },
   };

   int32_t ret = OH_Asset_Add(attr, sizeof(attr) / sizeof(attr[0]));     //ASSET数据库中添加数据
   if (ret == ASSET_SUCCESS) {
      // Asset added successfully.
   } else {
      // Failed to add Asset.
   }
}

 

二、删除关键资产(C/C++)

接口介绍

可通过API文档查看删除关键资产的接口OH_Asset_Remove的详细介绍。

在删除关键资产时,关键资产属性的内容参数如下表所示:

注意:

下表中名称包含“ASSET_TAG_DATA_LABEL”的关键资产属性,用于存储业务自定义信息,其内容不会被加密,请勿存放个人数据。

属性名称(Asset_Tag)属性内容(Asset_Value)是否必选说明
ASSET_TAG_ALIAS类型为uint8[],长度为1-256字节。可选关键资产别名,每条关键资产的唯一索引。
ASSET_TAG_ACCESSIBILITY类型为uint32_t,取值范围详见Asset_Accessibility可选基于锁屏状态的访问控制。
ASSET_TAG_REQUIRE_PASSWORD_SET类型为bool。可选是否仅在设置了锁屏密码的情况下,可访问关键资产。
ASSET_TAG_AUTH_TYPE类型为uint32_t,取值范围详见Asset_AuthType可选访问关键资产所需的用户认证类型。
ASSET_TAG_SYNC_TYPE类型为uint32_t,取值范围详见Asset_SyncType可选关键资产支持的同步类型。
ASSET_TAG_IS_PERSISTENT类型为bool。可选在应用卸载时是否需要保留关键资产。
ASSET_TAG_DATA_LABEL_CRITICAL_1类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且有完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_CRITICAL_2类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且有完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_CRITICAL_3类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且有完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_CRITICAL_4类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且有完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_NORMAL_1类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_NORMAL_2类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_NORMAL_3类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_NORMAL_4类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_112+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_212+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_312+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_412+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。

 

代码调用关系

base/security/asset/interfaces/kits/c/src/asset_api.c  :int32_t OH_Asset_Remove(const Asset_Attr *query, uint32_t queryCnt)

调用

base/security/asset/interfaces/inner_api/c/src/asset_system_api.c :int32_t AssetRemove(const AssetAttr *query, uint32_t queryCnt)

调用

base/security/asset/interfaces/inner_api/c/src/asset_system_api.c : int32_t remove_asset(const AssetAttr *query, uint32_t query_cnt);

代码示例

1、删除别名是demo_alias的关键资产。

2、在CMake脚本中链接相关动态库:target_link_libraries(entry PUBLIC libasset_ndk.z.so)

3、

参考如下示例代码,进行业务功能开发

#include <string.h>

#include "asset/asset_api.h"

void RemoveAsset() {
   static const char *ALIAS = "demo_alias";
   Asset_Blob alias = { (uint32_t)(strlen(ALIAS)), (uint8_t *)ALIAS };

   Asset_Attr attr[] = {
      { .tag = ASSET_TAG_ALIAS, .value.blob = alias }, // 此处指定别名删除,也可不指定别名删除多条数据
   };

   int32_t ret = OH_Asset_Remove(attr, sizeof(attr) / sizeof(attr[0]));  //ASSET数据库中删除数据
   if (ret == ASSET_SUCCESS) {
      // Asset removed successfully.
   } else {
      // Failed to remove Asset.
   }
}

 

三、更新关键资产(C/C++)

接口介绍

可通过API文档查看更新关键资产的接口OH_Asset_Update的详细介绍。

在更新关键资产时,关键资产属性的内容参数如下表所示:

注意:

下表中名称包含“ASSET_TAG_DATA_LABEL”的关键资产属性,用于存储业务自定义信息,其内容不会被加密,请勿存放个人数据。

  • query的参数列表:

    属性名称(Asset_Tag)属性内容(Asset_Value)是否必选说明
    ASSET_TAG_ALIAS类型为uint8[],长度为1-256字节。必选关键资产别名,每条关键资产的唯一索引。
    ASSET_TAG_ACCESSIBILITY类型为uint32_t,取值范围详见Asset_Accessibility可选基于锁屏状态的访问控制。
    ASSET_TAG_REQUIRE_PASSWORD_SET类型为bool。可选是否仅在设置了锁屏密码的情况下,可访问关键资产。
    ASSET_TAG_AUTH_TYPE类型为uint32_t,取值范围详见Asset_AuthType可选访问关键资产所需的用户认证类型。
    ASSET_TAG_SYNC_TYPE类型为uint32_t,取值范围详见Asset_SyncType可选关键资产支持的同步类型。
    ASSET_TAG_IS_PERSISTENT类型为bool。可选在应用卸载时是否需要保留关键资产。
    ASSET_TAG_DATA_LABEL_CRITICAL_1类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且有完整性保护。
    说明: API12前长度为1-512字节。
    ASSET_TAG_DATA_LABEL_CRITICAL_2类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且有完整性保护。
    说明: API12前长度为1-512字节。
    ASSET_TAG_DATA_LABEL_CRITICAL_3类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且有完整性保护。
    说明: API12前长度为1-512字节。
    ASSET_TAG_DATA_LABEL_CRITICAL_4类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且有完整性保护。
    说明: API12前长度为1-512字节。
    ASSET_TAG_DATA_LABEL_NORMAL_1类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
    说明: API12前长度为1-512字节。
    ASSET_TAG_DATA_LABEL_NORMAL_2类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
    说明: API12前长度为1-512字节。
    ASSET_TAG_DATA_LABEL_NORMAL_3类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
    说明: API12前长度为1-512字节。
    ASSET_TAG_DATA_LABEL_NORMAL_4类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
    说明: API12前长度为1-512字节。
    ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_112+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
    ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_212+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
    ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_312+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
    ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_412+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
  • attributesToUpdate的参数列表:

    属性名称(Asset_Tag)属性内容(Asset_Value)是否必选说明
    ASSET_TAG_SECRET类型为uint8[],长度为1-1024字节。可选关键资产明文。
    ASSET_TAG_DATA_LABEL_NORMAL_1类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
    说明: API12前长度为1-512字节。
    ASSET_TAG_DATA_LABEL_NORMAL_2类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
    说明: API12前长度为1-512字节。
    ASSET_TAG_DATA_LABEL_NORMAL_3类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
    说明: API12前长度为1-512字节。
    ASSET_TAG_DATA_LABEL_NORMAL_4类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
    说明: API12前长度为1-512字节。
    ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_112+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
    ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_212+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
    ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_312+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
    ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_412+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。

代码调用关系

base/security/asset/interfaces/kits/c/src/asset_api.c  :

int32_t OH_Asset_Update(const Asset_Attr *query, uint32_t queryCnt,

    const Asset_Attr *attributesToUpdate, uint32_t updateCnt)

调用

base/security/asset/interfaces/inner_api/c/src/asset_system_api.c :

int32_t AssetUpdate(const AssetAttr *query, uint32_t queryCnt,

    const AssetAttr *attributesToUpdate, uint32_t updateCnt)

调用

base/security/asset/interfaces/inner_api/c/src/asset_system_api.c :

int32_t update_asset(const AssetAttr *query, uint32_t query_cnt,

    const AssetAttr *attributes_to_update, uint32_t update_cnt);

代码示例

1、更新别名是demo_alias的关键资产,将关键资产明文更新为demo_pwd_new,附属信息更新成demo_label_new。

2、在CMake脚本中链接相关动态库:target_link_libraries(entry PUBLIC libasset_ndk.z.so)
3、

参考如下示例代码,进行业务功能开发

#include <string.h>

#include "asset/asset_api.h"

void UpdateAsset() {
   static const char *ALIAS = "demo_alias";
   static const char *SECRET = "demo_pwd_new";
   static const char *LABEL = "demo_label_new";

   Asset_Blob alias = { (uint32_t)(strlen(ALIAS)), (uint8_t *)ALIAS };
   Asset_Blob new_secret = { (uint32_t)(strlen(SECRET)), (uint8_t *)SECRET };
   Asset_Blob new_label = { (uint32_t)(strlen(LABEL)), (uint8_t *)LABEL };
   Asset_Attr query[] = { { .tag = ASSET_TAG_ALIAS, .value.blob = alias } };
   Asset_Attr attributesToUpdate[] = {
      { .tag = ASSET_TAG_SECRET, .value.blob = new_secret },
      { .tag = ASSET_TAG_DATA_LABEL_NORMAL_1, .value.blob = new_label },
   };

   int32_t ret = OH_Asset_Update(query, sizeof(query) / sizeof(query[0]), attributesToUpdate,
                                 sizeof(attributesToUpdate) / sizeof(attributesToUpdate[0]));    //ASSET数据库中更新数据
   if (ret == ASSET_SUCCESS) {
      // Asset updated successfully.
   } else {
      // Failed to update Asset.
   }
}

 

四、查询关键资产(C/C++)

接口介绍

可通过API文档查看查询关键资产的接口OH_Asset_Query 的详细介绍。

在查询关键资产时,关键资产属性的内容参数如下表所示:

注意:

下表中名称包含“ASSET_TAG_DATA_LABEL”的关键资产属性,用于存储业务自定义信息,其内容不会被加密,请勿存放个人数据。

属性名称(Asset_Tag)属性内容(Asset_Value)是否必选说明
ASSET_TAG_ALIAS类型为uint8[],长度为1-256字节。可选关键资产别名,每条关键资产的唯一索引。
ASSET_TAG_ACCESSIBILITY类型为uint32_t,取值范围详见Asset_Accessibility可选基于锁屏状态的访问控制。
ASSET_TAG_REQUIRE_PASSWORD_SET类型为bool。可选是否仅在设置了锁屏密码的情况下,可访问关键资产。
ASSET_TAG_AUTH_TYPE类型为uint32_t,取值范围详见Asset_AuthType可选访问关键资产所需的用户认证类型。
ASSET_TAG_SYNC_TYPE类型为uint32_t,取值范围详见Asset_SyncType可选关键资产支持的同步类型。
ASSET_TAG_IS_PERSISTENT类型为bool。可选在应用卸载时是否需要保留关键资产。
ASSET_TAG_DATA_LABEL_CRITICAL_1类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且有完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_CRITICAL_2类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且有完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_CRITICAL_3类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且有完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_CRITICAL_4类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且有完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_NORMAL_1类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_NORMAL_2类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_NORMAL_3类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_NORMAL_4类型为uint8[],长度为1-2048字节。可选关键资产附属信息,内容由业务自定义且无完整性保护。
说明: API12前长度为1-512字节。
ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_112+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_212+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_312+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
ASSET_TAG_DATA_LABEL_NORMAL_LOCAL_412+类型为uint8[],长度为1-2048字节。可选关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步。
ASSET_TAG_RETURN_TYPE类型为uint32_t,取值范围详见Asset_ReturnType可选关键资产查询返回的结果类型。
ASSET_TAG_RETURN_LIMIT类型为uint32_t。可选关键资产查询返回的结果数量。
ASSET_TAG_RETURN_OFFSET类型为uint32_t,取值范围:1-65536。可选关键资产查询返回的结果偏移量。
说明: 用于分批查询场景,指定从第几个开始返回。
ASSET_TAG_RETURN_ORDERED_BY类型为uint32_t,取值范围:ASSET_TAG_DATA_LABEL_xxx。可选关键资产查询返回的结果排序依据,仅支持按照附属信息排序。
说明: 默认按照关键资产新增的顺序返回。

约束和限制

批量查询出的关键资产需要通过IPC通道传输给业务,受IPC缓冲区大小限制,建议对查询超过40条关键资产时,进行分批查询,且每次查询数量不超过40条。

代码调用关系

base/security/asset/interfaces/kits/c/src/asset_api.c  :int32_t OH_Asset_Query(const Asset_Attr *query, uint32_t queryCnt, Asset_ResultSet *resultSet)

调用

base/security/asset/interfaces/inner_api/c/src/asset_system_api.c :int32_t AssetQuery(const AssetAttr *query, uint32_t queryCnt, AssetResultSet *resultSet)

调用

base/security/asset/interfaces/inner_api/c/src/asset_system_api.c :int32_t query_asset(const AssetAttr *query, uint32_t query_cnt, AssetResultSet *result_set);

代码示例


查询单条关键资产明文
1、查询别名是demo_alias的关键资产明文。

2、在CMake脚本中链接相关动态库:target_link_libraries(entry PUBLIC libasset_ndk.z.so)

3、

参考如下示例代码,进行业务功能开发

#include <string.h>

#include "asset/asset_api.h"

void QueryAsset() {
   static const char *ALIAS = "demo_alias";
   Asset_Blob alias = { (uint32_t)(strlen(ALIAS)), (uint8_t *)ALIAS };
   Asset_Attr attr[] = {
      { .tag = ASSET_TAG_ALIAS, .value.blob = alias },  // 指定了关键资产别名,最多查询到一条满足条件的关键资产
      { .tag = ASSET_TAG_RETURN_TYPE, .value.u32 = ASSET_RETURN_ALL },  // 此处表示需要返回关键资产的所有信息,即属性+明文
   };

   Asset_ResultSet resultSet = {0};
   int32_t ret = OH_Asset_Query(attr, sizeof(attr) / sizeof(attr[0]), &resultSet);
   if (ret == ASSET_SUCCESS) {
      // Parse the resultSet.
      for (uint32_t i = 0; i < resultSet.count; i++) {
            // Parse the secret: the data is secret->blob.data, the size is secret->blob.size.
            Asset_Attr *secret = OH_Asset_ParseAttr(resultSet.results + i, ASSET_TAG_SECRET);
      }
   }
   OH_Asset_FreeResultSet(&resultSet);
}

查询单条关键资产属性
1、查询别名是demo_alias的关键资产属性。

2、在CMake脚本中链接相关动态库:target_link_libraries(entry PUBLIC libasset_ndk.z.so)
3、

参考如下示例代码,进行业务功能开发

#include <string.h>

#include "asset/asset_api.h"

void QueryAttributes() {
   static const char *ALIAS = "demo_alias";
   Asset_Blob alias = { (uint32_t)(strlen(ALIAS)), (uint8_t *)ALIAS };
   Asset_Attr attr[] = {
      { .tag = ASSET_TAG_ALIAS, .value.blob = alias }, // 指定了关键资产别名,最多查询到一条满足条件的关键资产
      { .tag = ASSET_TAG_RETURN_TYPE, .value.u32 = ASSET_RETURN_ATTRIBUTES }, // 此处表示仅返回关键资产属性,不包含关键资产明文
   };

   Asset_ResultSet resultSet = {0};
   int32_t ret = OH_Asset_Query(attr, sizeof(attr) / sizeof(attr[0]), &resultSet);
   if (ret == ASSET_SUCCESS) {
      // Parse the result.
      for (uint32_t i = 0; i < resultSet.count; i++) {
      // Parse the data label: the data is label->blob.data, the size is label->blob.size.
            Asset_Attr *label = OH_Asset_ParseAttr(resultSet.results + i, ASSET_TAG_DATA_LABEL_NORMAL_1);
      }
   }
   OH_Asset_FreeResultSet(&resultSet);
}

批量查询关键资产属性
1、批量查询附属信息是demo_label的关键资产属性,从第5条满足条件的结果开始返回,一共返回10条,且返回结果以DATA_LABEL_NORMAL_1属性内容排序。

2、在CMake脚本中链接相关动态库:target_link_libraries(entry PUBLIC libasset_ndk.z.so)
3、参考如下示例代码,进行业务功能开发

#include <string.h>

#include "asset/asset_api.h"

void BatchQuery() {
   static const char *LABEL = "demo_label";
   Asset_Blob label = { (uint32_t)(strlen(LABEL)), (uint8_t *)LABEL };

   Asset_Attr attr[] = {
      { .tag = ASSET_TAG_RETURN_TYPE, .value.u32 = ASSET_RETURN_ATTRIBUTES },
      { .tag = ASSET_TAG_DATA_LABEL_NORMAL_1, .value.blob = label },
      { .tag = ASSET_TAG_RETURN_OFFSET, .value.u32 = 5 },
      { .tag = ASSET_TAG_RETURN_LIMIT, .value.u32 = 10 },
      { .tag = ASSET_TAG_RETURN_ORDERED_BY, .value.u32 = ASSET_TAG_DATA_LABEL_NORMAL_1 },
   };

   Asset_ResultSet resultSet = { 0 };
   int32_t ret = OH_Asset_Query(attr, sizeof(attr) / sizeof(attr[0]), &resultSet);
   if (ret == ASSET_SUCCESS) {
      // Parse the result.
      for (uint32_t i = 0; i < resultSet.count; i++) {
            // Parse the data alias: the data is alias->blob.data, the size is alias->blob.size..
            Asset_Attr *alias = OH_Asset_ParseAttr(resultSet.results + i, ASSET_TAG_ALIAS);
      }
   }
   OH_Asset_FreeResultSet(&resultSet);
}

 

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐