# Asset Store Kit简介

Asset Store Kit（关键资产存储服务，简称ASSET）用于提供用户短敏感数据的安全存储及管理功能。这类短敏感数据包括但不限于密码类（账号/密码）、Token类（应用凭据）以及其他关键明文（如银行卡号）等长度较短的敏感信息。

关键资产存储服务提供安全存储能力，主要体现在以下几个方面：

*   **安全环境执行：** 关键资产的加解密操作和访问控制校验均在安全环境（如可信执行环境）中完成，使用AES256-GCM算法进行加密，密钥存储在通用密钥库系统中，保证用户敏感数据不发生泄露。
*   **身份隔离：** 关键资产存储服务会对应用身份（应用的appId）校验，确保应用只能读取或修改本应用的数据，无法读取或修改其他应用数据。相同群组的应用之间数据可以互相访问，详情请参见管理群组关键资产(ArkTS)/管理群组关键资产(C/C++)。
*   **访问控制：** 支持基于属主、群组、锁屏状态、锁屏密码设置状态、用户认证等多维度访问控制策略。

ASSET数据存储结构如下图所示：

#### 基本概念

关键资产的安全存储，依赖底层的通用密钥库系统。具体来说，关键资产的加/解密操作以及访问控制校验，都由通用密钥库系统在安全环境（如可信执行环境）中完成，即使系统被攻破，也能保证用户敏感数据不发生泄露。

其中，关键资产的加/解密使用AES256-GCM算法，关键资产的访问控制分为以下几类。

*   **基于属主的访问控制：** 所有的关键资产都受属主访问控制保护，业务无需设置。
    
    *   只允许关键资产被其属主（写入该关键资产的业务）访问。
    *   关键资产属主身份（应用的appId）由ASSET从系统服务中获取，即使业务身份被仿冒，仿冒者也无法获取到其他业务的数据。
    *   关键资产加/解密时，其属主身份参与了完整性保护，即使关键资产属主身份被篡改，攻击者也无法获取到其他业务的数据。
*   **基于群组的访问控制：**
    
    *   同一开发者开发的多个应用，可配置为同一群组，并在存储关键资产时设置群组共享，以便群组内的多个应用可以互通访问数据。
    *   关键资产所属的群组信息，由开发者ID和群组ID组成。其中，开发者ID无需配置，群组ID在应用开发期配置，参考配置文件标签说明。应用发布时使用开发者私钥签名保证群组ID的完整性。
    *   开发者可以为应用配置多个群组，根据关键资产的共享范围，将不同关键资产配置在相应的群组内，从而实现细粒度的群组访问控制。
*   **基于锁屏状态的访问控制：** 分为以下三种保护等级（安全性依次递增），业务可根据实际情况设置任意一种，若不设置，则默认保护等级为“首次解锁后可访问”。
    
    *   开机后可访问：关键资产在开机后被允许访问。
    *   首次解锁后可访问：关键资产在开机首次解锁后被允许访问。
    *   屏幕处于解锁状态时可访问：关键资产仅在处于解锁状态时被允许访问。
*   **基于锁屏密码设置状态的访问控制：** 该访问控制默认不开启，业务可根据实际情况决定是否开启。
    
    *   在用户设置了锁屏密码后，关键资产才被允许访问。
*   **基于用户认证的访问控制：** 该访问控制默认不开启，业务可根据实际情况决定是否开启。
    
    *   关键资产在用户身份认证通过后被允许访问。
    *   任意一种认证方式（指纹、人脸、PIN码）通过，均可授权本次关键资产的访问。
    *   业务可通过设置认证有效期，达成一次用户认证、授权多个关键资产访问的效果。认证有效期最长可设置10分钟。

#### 约束与限制

*   设备限制
    
    轻量级智能穿戴设备暂不支持使用本Kit。
    
*   使用限制
    
    ASSET以安全存储为核心设计目标，提供用户短敏感数据的安全存储能力，并非通用存储服务。使用时需遵循以下限制：
    
    *   **不适用于大量数据存储：** ASSET面向密码、Token、银行卡号等长度较短、数量有限的关键敏感信息，并非为大数据量场景设计。对于较长的数据，请考虑使用通用密钥库系统或加解密算法库框架保护数据。
        
    *   **不适用于高性能场景：** 关键资产的加解密操作和访问控制校验均在安全环境（如可信执行环境）中完成，相较于常规存储存在更高的性能开销，不适合高频读写、低时延等高性能场景。对性能敏感的业务请勿将ASSET作为常规存储使用。
        
    *   **非短敏感数据不推荐使用ASSET存储：** ASSET侧重安全而非通用存储，将非敏感的常规业务数据存入ASSET既无法发挥其安全优势，又会占用本就有限的存储资源。对于非短敏感数据，请使用系统提供的常规存储能力。
        
*   基于别名的访问
    
    关键资产以密文的形式存储在ASSET数据库中，以业务身份（应用的appId） + 别名作为唯一索引。故业务需要保证每条关键资产的别名唯一。
    
*   批量查询关键资产
    
    批量查询出的关键资产需要通过IPC通道传输给业务，受IPC缓冲区大小限制，建议对查询超过40条关键资产时，进行分批查询，且每次查询数量不超过40条。
    
*   业务自定义数据存储
    
    *   ASSET为业务预留了12个关键资产自定义属性，名称以"DATA\_LABEL"开头。对于超过12个自定义属性的情况，业务可以将多段数据按照一定的格式（如JSON）拼接到同一个ASSET属性中。
        
    *   ASSET对部分属性会进行完整性保护，这部分属性名称以"DATA\_LABEL\_CRITICAL"开头，写入后不支持更新。
        
*   基于群组的访问控制
    
    *   ASSET不支持沙箱应用、应用分身存储或访问群组数据。
        
    *   IS\_PERSISTENT属性设置为True的关键资产，不允许设置为群组共享。
        

#### 数据生命周期

关键资产有且仅有以下删除时机：

*   业务主动调用remove删除关键资产时，删除符合条件的数据。详见删除关键资产(ArkTS)/删除关键资产(C/C++)开发指导。
*   应用卸载时，关键资产存储服务会清除对应的数据。IS\_PERSISTENT属性设置为true的数据将保留。
    *   对于API版本21及之后版本：清除存储在ASSET中的非群组数据。群组数据仅在群组内所有应用卸载时清除。
    *   对于API版本20及之前版本：清除存储在ASSET中的非群组和群组数据。
*   系统子用户删除时，清除该用户下ASSET中所有数据。
*   设备恢复出厂设置时，清除ASSET中所有数据。

#### 模拟器支持情况

本Kit支持模拟器。

模拟器与真机存在通用差异，详情请参见详情请参见模拟器与真机的差异。

#### 与相关Kit的关系

关键资产存储服务仅提供短敏感数据（不超过1KB）的安全存储能力，如业务希望对超长的数据提供保护时，请考虑使用通用密钥库系统或加解密算法库框架保护您的数据。