安全子系统之关键资产存储服务(ASSET)
简介 关键资产存储服务(ASSET),提供了用户短敏感数据的安全存储及管理能力。其中,短敏感数据可以是密码类(账号/密码)、Token类(应用凭据)、其他关键明文(如银行卡号)等长度较短的用户敏感数据。关键资产存储服务仅提供短敏感数据(不超过1KB)的安全存储能力,如业务希望对超长的数据提供保护时,请考虑使用通用密钥库系统或加解密算法库框架保护您的数据。 使用场景 一、保护密码类数据
简介
关键资产存储服务(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);
}
更多推荐
所有评论(0)