在数字化时代,数据安全已成为应用的生死线,而鸿蒙Next的Asset Store Kit正是守护关键资产的利器。
在移动应用开发中,我们经常需要处理各种敏感信息:用户密码、身份令牌、加密密钥等。这些关键资产若存储不当,可能导致灾难性后果。鸿蒙Next的Asset Store Kit (关键资产存储服务)为解决这一难题提供了完整方案,它如同一个高安全性的保险箱,为应用的关键数据提供全方位保护。
一、什么是Asset Store Kit?
Asset Store Kit是鸿蒙Next提供的关键资产存储开发服务,专门用于保护用户的短敏感数据。它与iOS中的Keychain类似,但针对鸿蒙生态进行了深度优化。
关键资产是指那些长度较短但敏感性高的数据,主要包括:
-
密码类:用户账号密码、支付密码等
-
Token类:应用访问令牌、身份验证凭据等
-
其他关键明文:银行卡号、个人信息等
与普通存储方式不同,Asset Store Kit的安全存储依赖于底层的通用密钥库系统。加解密操作和访问控制校验都在安全环境(如可信执行环境)中完成,即使系统被攻破,也能保证用户敏感数据不发生泄露。
二、Asset Store Kit的核心特性
1. 强大的加密保护
Asset Store Kit使用AES256-GCM算法 对关键资产进行加密。这是一种高强度的加密标准,同时提供加密和认证功能,确保数据的机密性和完整性。
相较于传统的存储方式,即使攻击者获取了存储的物理数据,也无法破解其中的内容,因为密钥被安全地保存在硬件级安全区域中。
2. 多层次的访问控制
Asset Store Kit提供了四种访问控制机制,开发者可以根据数据敏感度灵活选择:
-
基于属主的访问控制:确保只有写入资产的应用(属主)才能访问,实现应用间数据隔离
-
基于锁屏状态的访问控制:分为开机后可访问、首次解锁后可访问和解锁时可访问三个等级
-
基于锁屏密码设置状态的访问控制:可要求设备必须设置锁屏密码才能访问关键资产
-
基于用户认证的访问控制:支持指纹、人脸、PIN码等多种生物特征验证
3. 数据持久化控制
通过设置IS_PERSISTENT
属性,开发者可以控制应用卸载时是否保留关键资产。
javascript
attr.set(asset.Tag.IS_PERSISTENT, true); // 应用卸载后保留数据
需要注意的是,使用此功能需要声明ohos.permission.STORE_PERSISTENT_DATA
权限,否则会收到权限校验失败错误。
4. 数据同步灵活性
通过SYNC_TYPE
属性,可以指定关键资产的同步策略。例如,设置SyncType.THIS_DEVICE
可使数据仅在本设备保存,不同步到其他设备,这对于设备特定的凭证非常有用。
三、Asset Store Kit的实际应用
1. 实现"记住密码"功能
以下是一个完整的"记住密码"功能实现示例:
javascript
import { asset } from '@kit.AssetStoreKit';
import { util } from '@kit.ArkTS';
import { BusinessError } from '@kit.BasicServicesKit';
// 字符串与Uint8Array转换函数
function stringToArray(str: string): Uint8Array {
let textEncoder = new util.TextEncoder();
return textEncoder.encodeInto(str);
}
function arrayToString(arr: Uint8Array): string {
let textDecoder = util.TextDecoder.create("utf-8", { ignoreBOM: true });
let str = textDecoder.decodeWithStream(arr, { stream: false });
return str;
}
// 存储密码
async function storePassword(password: string, alias: string) {
let attr: asset.AssetMap = new Map();
attr.set(asset.Tag.SECRET, stringToArray(password));
attr.set(asset.Tag.ALIAS, stringToArray(alias));
attr.set(asset.Tag.SYNC_TYPE, asset.SyncType.THIS_DEVICE);
try {
await asset.add(attr);
console.info('Password stored successfully.');
} catch (error) {
let err = error as BusinessError;
console.error(`Failed to store password. Code is ${err.code}, message is ${err.message}`);
}
}
// 查询密码
async function queryPassword(alias: string): Promise<string> {
let query: asset.AssetMap = new Map();
query.set(asset.Tag.ALIAS, stringToArray(alias));
query.set(asset.Tag.RETURN_TYPE, asset.ReturnType.ALL); // 必须设置以返回明文:cite[8]
try {
let res: Array<asset.AssetMap> = asset.querySync(query);
if (res.length > 0) {
let secret: Uint8Array = res[0].get(asset.Tag.SECRET) as Uint8Array;
return arrayToString(secret);
}
} catch (error) {
let err = error as BusinessError;
console.error(`Failed to query password. Code is ${err.code}, message is ${err.message}`);
}
return "";
}
2. 关键资产更新与管理
更新关键资产也很简单,以下是更新别名对应的关键资产明文的示例:
javascript
let query: asset.AssetMap = new Map();
query.set(asset.Tag.ALIAS, stringToArray('demo_alias'));
let attrsToUpdate: asset.AssetMap = new Map();
attrsToUpdate.set(asset.Tag.SECRET, stringToArray('new_password'));
try {
asset.update(query, attrsToUpdate).then(() => {
console.info(`Succeeded in updating Asset.`);
}).catch((err: BusinessError) => {
console.error(`Failed to update Asset. Code is ${err.code}, message is ${err.message}`);
});
} catch (err) {
console.error(`Failed to update Asset. Code is ${err?.code}, message is ${err?.message}`);
}
四、常见问题与解决方案
1. 查询不到关键资产明文
使用query接口时,如果无法获取asset.Tag.SECRET
对应的value,可能是因为没有设置正确的RETURN_TYPE
。需要添加以下设置:
javascript
query.set(asset.Tag.RETURN_TYPE, asset.ReturnType.ALL);
2. 权限配置问题
使用Asset Store Kit需要配置SystemCapability.Security.Asset能力。如果遇到相关问题,需要检查syscap.json文件的配置,并参考官方SysCap开发指导。
3. 应用卸载后数据保留
如需在应用卸载后保留关键资产,需要设置IS_PERSISTENT
属性并声明相应权限:
javascript
attr.set(asset.Tag.IS_PERSISTENT, true);
同时,在应用的配置文件中声明权限:
json
{
"permissions": [
{
"name": "ohos.permission.STORE_PERSISTENT_DATA"
}
]
}
五、最佳实践建议
-
根据数据敏感度选择合适的访问控制等级:对于极高敏感的数据,建议启用用户认证访问控制。
-
合理使用别名系统:确保每条关键资产的别名唯一且有意义,便于管理和检索。
-
错误处理:在所有Asset操作中添加适当的错误处理逻辑,提高应用健壮性。
-
考虑用户场景:根据用户使用习惯设置适当的认证有效期,平衡安全性与用户体验。
总结
Asset Store Kit作为鸿蒙Next的关键资产存储服务,为开发者提供了企业级的安全保障。通过硬件级加密、多维度访问控制和灵活的数据管理策略,它使得敏感数据的安全存储变得简单而可靠。
在数据泄露事件频发的今天,利用好Asset Store Kit不仅是技术选择,更是对用户信任的负责。作为鸿蒙开发者,我们应当充分掌握这一利器,为用户构建更加安全可靠的应用体验。
安全不是产品的特性,而是产品的基石。Asset Store Kit正是鸿蒙Next为我们奠定的坚实安全基石之一。