本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前 API12)在开发多语言电商平台方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。
在HarmonyOS Next系统的安全架构中,Asset Store Kit占据着举足轻重的地位,它为关键资产的存储和管理提供了坚实的基础,是保障系统安全与用户数据隐私的重要组成部分。
(一)引言
- 重要地位阐述
- Asset Store Kit是HarmonyOS Next生态系统中不可或缺的一部分,它犹如一座坚固的堡垒,专门用于保护那些对应用和用户至关重要的关键资产。这些关键资产涵盖了密码类数据(如账号密码)、Token类数据(应用凭据)以及其他敏感的明文信息(如银行卡号等)。在当今数字化时代,这些数据的安全性直接关系到用户的财产安全、隐私保护以及应用的正常运行。例如,在移动支付应用中,用户的银行卡号和支付密码等关键资产必须得到妥善保护,否则将面临巨大的风险。Asset Store Kit通过提供一系列强大的功能和机制,确保这些关键资产在存储、访问和管理过程中的安全性,从而为整个HarmonyOS Next系统的稳定运行提供了有力支撑。 - 关键作用强调
- 其关键作用主要体现在两个方面。一方面,它提供了统一的接口和方法,使得开发者能够方便、高效地存储和管理关键资产。开发者无需深入了解复杂的底层安全机制,只需调用Asset Store Kit提供的简单易用的接口,即可实现关键资产的安全存储和操作。另一方面,Asset Store Kit通过多种安全措施,如加密算法和访问控制机制,有效防止关键资产被非法获取和篡改。这不仅保护了用户的利益,也增强了用户对应用的信任,促进了应用的广泛使用和发展。
(二)关键资产存储原理
- 通用密钥库系统的依赖
- 关键资产的安全存储高度依赖于底层的通用密钥库系统。通用密钥库系统就像是一个安全的保险柜,负责存储和管理用于加密和解密关键资产的密钥。当应用需要存储关键资产时,Asset Store Kit会与通用密钥库系统进行交互,获取相应的密钥。然后,利用这些密钥,通过先进的加密算法(如AES256 - GCM算法)对关键资产进行加密处理,将其转换为密文形式后存储在ASSET数据库中。例如,在存储用户密码时,首先从通用密钥库系统获取加密密钥,然后使用该密钥对密码进行加密,确保密码在存储过程中的机密性。 - 安全环境中的加解密执行
- 加解密操作在安全环境(如可信执行环境)中进行,这为关键资产的安全性提供了额外的保障。可信执行环境是一个独立的、隔离的硬件区域,具有高度的安全性。在这个环境中,即使系统的其他部分遭受恶意攻击,加解密操作仍然能够安全地执行,不会泄露关键资产的信息。例如,当用户登录应用并需要验证密码时,密码的解密操作在可信执行环境中进行,解密后的密码与用户输入的密码进行比对,只有在比对成功后,用户才能获得相应的访问权限。这样的设计确保了密码在整个验证过程中始终处于安全状态,有效防止了密码被窃取或篡改。
(三)访问控制机制
- 基于属主的访问控制
- 所有关键资产都受到属主访问控制的严格保护,这是一种最基本的访问控制方式,业务无需额外设置。其核心原理是,只有写入该关键资产的业务(即属主)才能对其进行访问。例如,在一个电商应用中,用户的订单信息是由该电商应用写入到关键资产存储中的,那么只有这个电商应用有权访问和管理这些订单信息。即使其他应用试图获取这些订单信息,也会因为不具备属主身份而被拒绝访问。这种基于属主的访问控制机制有效地防止了不同业务之间的数据交叉访问,确保了每个业务的数据独立性和安全性。 - 基于锁屏状态的访问控制
- 此访问控制分为三个等级,分别为开机后可访问、首次解锁后可访问和解锁时可访问,其安全性依次递增。
- 开机后可访问:适用于一些对安全性要求相对较低,但又需要一定便利性的场景。例如,某些新闻资讯类应用,用户可能希望在开机后就能快速访问应用中的内容,而不需要先解锁设备。在这种情况下,应用可以将相关的关键资产(如用户的浏览历史记录等)设置为开机后可访问,以提升用户体验。
- 首次解锁后可访问:这是一种较为常用的设置,适用于大多数普通应用。例如,社交类应用中的用户聊天记录等关键资产,在用户首次解锁设备后即可访问。这样既保证了一定的安全性,防止设备在未解锁状态下关键资产被非法访问,又能在用户解锁后方便地使用应用,提高了应用的可用性。
- 解锁时可访问:对于安全性要求极高的应用,如银行类应用或涉及重要商业机密的企业应用,通常会将关键资产设置为解锁时可访问。这意味着只有当设备处于解锁状态,且用户通过了身份验证(如密码、指纹、人脸等)后,才能访问这些关键资产。例如,银行应用中的用户账户余额、交易明细等关键信息,只有在用户解锁设备并通过身份验证后才能查看,最大限度地保障了用户的资金安全和隐私。 - 基于锁屏密码设置状态的访问控制
- 该访问控制默认处于关闭状态,开发者可以根据实际应用场景决定是否开启。当开启此功能后,关键资产只有在用户设置了锁屏密码的情况下才被允许访问。例如,在一个存储用户个人隐私照片的相册应用中,开发者可以选择开启基于锁屏密码设置状态的访问控制。这样,只有当用户为设备设置了锁屏密码,确保设备有一定的安全性基础后,才能访问相册中的照片,有效防止他人在设备未设置锁屏密码时轻易获取用户的隐私照片。 - 基于用户认证的访问控制
- 同样默认关闭,开发者可按需开启。开启后,关键资产在用户通过身份认证(如指纹、人脸、PIN码等任意一种认证方式)后才会被允许访问。并且,开发者可以设置认证有效期,最长可达10分钟。例如,在企业内部使用的办公应用中,用户可能需要频繁访问一些敏感文件(如公司财务报表等关键资产)。通过开启基于用户认证的访问控制,并设置适当的认证有效期(如5分钟),用户在首次认证后的5分钟内进行多次文件访问操作时无需重复认证,既提高了工作效率,又保证了文件的安全性。在认证有效期过后,若用户再次访问关键资产,则需要重新进行身份认证。
(四)关键资产属性说明
- 属性列表与含义(表格形式)
属性名称 | 含义 | 是否必选 | 说明 |
---|---|---|---|
ALIAS(别名) | 用于唯一标识每条关键资产的字符串,类型为Uint8Array,长度为1 - 256字节 | 可选 | 是业务查找和操作关键资产的重要依据,类似于数据库中的索引,必须保证每条关键资产的别名唯一 |
ACCESSIBILITY(访问控制等级) | 基于锁屏状态的访问控制设置,类型为number,取值范围详见Accessibility | 可选 | 决定关键资产在何种锁屏状态下可被访问,如开机后、首次解锁后或解锁时可访问 |
REQUIRE_PASSWORD_SET(锁屏密码要求) | 是否仅在设置了锁屏密码的情况下可访问关键资产,类型为bool | 可选 | 可进一步增强关键资产的安全性,根据业务需求决定是否开启此限制 |
AUTH_TYPE(认证类型) | 访问关键资产所需的用户认证类型,类型为number,取值范围详见AuthType | 可选 | 指定访问关键资产时需要的用户认证方式,如指纹、人脸、PIN码等 |
SYNC_TYPE(同步类型) | 关键资产支持的同步类型,类型为number,取值范围详见SyncType | 可选 | 用于控制关键资产在多设备之间的同步行为,例如是否自动同步等 |
IS_PERSISTENT(持久化属性) | 在应用卸载时是否需要保留关键资产,类型为bool | 可选 | 决定关键资产在应用卸载后的留存情况,对于一些需要长期保存的数据(如用户重要配置信息)可设置为保留 |
DATA_LABEL_CRITICAL_1 - 4(关键附属信息) | 关键资产附属信息,内容由业务自定义且有完整性保护,类型为Uint8Array,长度为1 - 2048字节(API12前为1 - 512字节) | 可选 | 用于存储与关键资产相关的重要附加信息,且保证信息的完整性,写入后不支持更新 |
DATA_LABEL_NORMAL_1 - 4(普通附属信息) | 关键资产附属信息,内容由业务自定义且无完整性保护,类型为Uint8Array,长度为1 - 2048字节(API12前为1 - 512字节) | 可选 | 存储一般的附属信息,业务可根据需要自由更新内容 |
DATA_LABEL_NORMAL_LOCAL_1 - 4(本地附属信息) | 关键资产附属的本地信息,内容由业务自定义且无完整性保护,该项信息不会进行同步,类型为Uint8Array,长度为1 - 2048字节 | 可选 | 用于存储仅在本地使用的关键资产相关信息,不会在多设备间同步,可减少不必要的数据传输和存储 |
RETURN_TYPE(查询返回类型) | 关键资产查询返回的结果类型,类型为number,取值范围详见ReturnType | 可选 | 指定查询关键资产时返回结果的格式和内容类型 |
RETURN_LIMIT(查询返回数量限制) | 关键资产查询返回的结果数量,类型为number | 可选 | 限制查询操作返回的关键资产数量,可用于控制数据量和提高查询效率 |
RETURN_OFFSET(查询返回偏移量) | 指定从第几个关键资产开始返回查询结果,取值范围为1 - 65536,类型为number | 可选 | 用于分批查询场景,可实现对大量关键资产的分页查询,提高查询性能和灵活性 |
RETURN_ORDERED_BY(查询结果排序依据) | 仅支持按照附属信息排序,取值范围为asset.Tag.DATA_LABEL_xxx,类型为number | 可选 | 决定查询结果的排序方式,方便业务根据特定需求获取有序的关键资产列表 |
- 属性在资产识别、访问控制和管理中的作用
- ALIAS属性在资产识别中起着关键作用,通过唯一的别名,开发者可以快速准确地定位和操作特定的关键资产。例如,在一个包含多个用户账号密码的应用中,每个账号密码都有其对应的别名,开发者可以根据别名查找和更新特定用户的密码。
- ACCESSIBILITY属性直接影响关键资产的访问控制,不同的访问控制等级决定了在何种情况下关键资产可以被访问,从而保护关键资产免受未经授权的访问。
- REQUIRE_PASSWORD_SET属性增强了访问控制的安全性,确保只有在设备设置了锁屏密码的情况下,关键资产才可能被访问,为关键资产提供了额外的保护屏障。
- AUTH_TYPE属性明确了访问关键资产所需的用户认证方式,通过指定合适的认证类型,如要求指纹认证或PIN码认证,进一步提高了关键资产的访问安全性。
- SYNC_TYPE属性则在多设备管理关键资产时发挥作用,开发者可以根据应用需求设置关键资产是否同步以及如何同步,以满足用户在不同设备上使用应用的一致性体验。
- 其他属性如IS_PERSISTENT、各种DATA_LABEL属性等在资产的持久化存储、附加信息管理以及查询结果控制等方面提供了丰富的功能,帮助开发者更好地管理和利用关键资产。
(五)示例代码演示
- 以下是一段ArkTS代码示例,展示如何创建一个具有特定属性的关键资产(假设存储一个用户的登录凭据):
import { asset } from '@kit.AssetStoreKit';
import { util } from '@kit.ArkTS';
import { BusinessError } from '@kit.BasicServicesKit';
function stringToArray(str: string): Uint8Array {
let textEncoder = new util.TextEncoder();
return textEncoder.encodeInto(str);
}
// 创建一个关键资产,包含用户名、密码和相关属性
let attr: asset.AssetMap = new Map();
attr.set(asset.Tag.SECRET, stringToArray('userPassword123')); // 假设密码为"userPassword123"
attr.set(asset.Tag.ALIAS, stringToArray('loginCredential')); // 设置别名为"loginCredential"
attr.set(asset.Tag.ACCESSIBILITY, asset.Accessibility.FIRST_UNLOCKED); // 设置为首次解锁后可访问
attr.set(asset.Tag.DATA_LABEL_NORMAL_1, stringToArray('userLoginInfo')); // 存储一些普通附属信息,如登录相关的其他说明
try {
asset.add(attr).then(() => {
console.info('Key asset created successfully.');
}).catch((err: BusinessError) => {
console.error('Failed to create key asset. Code is ${err.code}, message is ${err.message}');
});
} catch (error) {
let err = error as BusinessError;
console.error('Failed to create key asset. Code is ${err.code}, message is ${err.message}');
}
(六)总结与思考
- 基础功能要点总结
- Asset Store Kit的基础功能围绕关键资产的安全存储、访问控制和管理展开。通过依赖通用密钥库系统进行安全存储,利用多种访问控制机制确保资产安全,以及提供丰富的属性来满足不同的管理需求。开发者需要理解关键资产的存储原理,掌握各种访问控制方式的特点和适用场景,熟悉关键资产属性的含义和用法,才能在应用开发中充分发挥Asset Store Kit的优势。 - 应用需求思考引导
- 对于我们开发来说,在实际应用开发中,需要根据应用的类型、用户需求和安全要求来合理运用Asset Store Kit的功能。例如,对于金融类应用,应着重考虑高强度的访问控制(如解锁时可访问、基于用户认证等)和严格的密码策略(如设置密码长度、复杂度要求等);而对于一些普通的娱乐类应用,可以在保证一定安全性的前提下,更注重用户体验,选择合适的访问控制等级(如首次解锁后可访问)。同时,还需要考虑如何合理设计关键资产的属性,以优化数据存储和查询效率。在多设备应用场景下,要充分利用同步功能,确保用户在不同设备上的数据一致性和安全性。总之,我们应深入思考如何将Asset Store Kit的功能与应用的具体需求完美结合,为用户提供既安全又便捷的应用体验。