1

作为一名公司中的HarmonyOS开发人员,我有一天被老板叫到办公室,给了我一个任务:“我们需要利用HarmonyOS关键资产存储服务,开发一套安全的用户数据管理系统。”老板要求我确保短敏感数据(如密码、Token等)能够被安全地存储和管理。

image.png

听完老板的需求,我感到有些压力。这是一个全新的任务,涉及系统安全和数据存储,我需要利用@ohos.security.asset模块来实现它。回到工位后,我开始仔细研究HarmonyOS 5.0.0(12)的文档,试图理解关键资产存储服务所提供的功能。

理解与准备

我先查看了官方的文档,文档中介绍了关键资产存储服务的功能,它允许我们对密码、Token等敏感数据进行安全存储和管理。为了满足老板的需求,我首先导入了相关模块,并编写了第一个测试代码:

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);
}

通过阅读文档,我了解到关键资产存储服务提供了多个强大的接口,例如asset.add用于添加关键资产,asset.update用于更新资产属性,asset.query用于查询资产。这些接口正好可以帮助我完成老板提出的需求。

在开始开发之前,我还仔细研究了关键资产存储服务的错误码列表和各种可能出现的异常情况。为了更好地理解这些错误码的含义,我查阅了系统权限相关的文档,确保在开发过程中能够处理好权限问题,以避免不必要的错误发生。

image.png

实现关键资产的存储

首先,我实现了一个添加关键资产的功能。考虑到安全性,我决定将用户的密码和别名以字节数组的形式存储,并使用异步的asset.add接口。

let attr: asset.AssetMap = new Map();
attr.set(asset.Tag.SECRET, stringToArray('demo_pwd'));
attr.set(asset.Tag.ALIAS, stringToArray('demo_alias'));
attr.set(asset.Tag.ACCESSIBILITY, asset.Accessibility.DEVICE_FIRST_UNLOCKED);
attr.set(asset.Tag.DATA_LABEL_NORMAL_1, stringToArray('demo_label'));
try {
  asset.add(attr).then(() => {
    console.info("Asset added successfully.");
  }).catch((err: BusinessError) => {
    console.error(`Failed to add Asset. Code is ${err.code}, message is ${err.message}`);
  });
} catch (error) {
  let err = error as BusinessError;
  console.error(`Failed to add Asset. Code is ${err.code}, message is ${err.message}`);
}

在这段代码中,我利用asset.add异步地新增了一条关键资产。通过设置访问控制属性(asset.Accessibility.DEVICE_FIRST_UNLOCKED),确保数据在设备首次解锁后才能访问,从而提高了数据的安全性。

在添加关键资产的过程中,我注意到访问控制的属性非常重要。例如,DEVICE_FIRST_UNLOCKED这个选项意味着只有在设备首次解锁后,才能访问到该数据。这种设计增加了数据的安全性,确保了即使设备丢失,未经授权的人也无法轻易访问这些敏感信息。

更新与查询功能

添加关键资产后,老板又提出了新需求:“用户可能需要更新他们的密码,所以我们必须支持更新功能。”为了解决这个问题,我研究了asset.update接口,并编写了以下代码:

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('demo_pwd_new'));
try {
  asset.update(query, attrsToUpdate).then(() => {
    console.info("Asset updated successfully.");
  }).catch((err: BusinessError) => {
    console.error(`Failed to update Asset. Code is ${err.code}, message is ${err.message}`);
  });
} catch (error) {
  let err = error as BusinessError;
  console.error(`Failed to update Asset. Code is ${err.code}, message is ${err.message}`);
}

在这段代码中,我通过别名查询定位到关键资产,并使用新的密码对其进行更新。这样一来,用户的密码管理功能就得以实现。

为了进一步增强用户体验,我还在更新密码功能中加入了一些额外的验证逻辑。例如,确保用户在更新密码时输入的两次新密码一致,避免由于输入错误而导致密码无法更新成功。这些小细节能够显著提升系统的易用性和用户满意度。

此外,为了向用户展示他们存储的数据,我还实现了查询功能。使用asset.query接口,我能够查找并返回符合条件的关键资产。

try {
  asset.query(query).then((res: Array<asset.AssetMap>) => {
    for (let i = 0; i < res.length; i++) {
      let accessibility: number = res[i].get(asset.Tag.ACCESSIBILITY) as number;
      console.info(`Asset found with accessibility: ${accessibility}`);
    }
    console.info("Asset query succeeded.");
  }).catch ((err: BusinessError) => {
    console.error(`Failed to query Asset. Code is ${err.code}, message is ${err.message}`);
  });
} catch (error) {
  let err = error as BusinessError;
  console.error(`Failed to query Asset. Code is ${err.code}, message is ${err.message}`);
}

在实现查询功能时,我还考虑到了可能的性能问题。为了避免查询过程中占用过多系统资源,我对查询条件进行了优化,确保只返回需要的数据。这种优化在面对大量关键资产时尤其重要,能够显著提高系统的响应速度。

遇到的挑战与解决方法

在实现这些功能的过程中,我遇到了一些挑战。例如,在更新关键资产时,有时会遇到“锁屏状态不匹配”或“系统内存不足”的错误码。为了解决这些问题,我仔细查看了错误码列表,并相应地调整了逻辑,比如在特定条件下重新尝试请求。

尤其是“锁屏状态不匹配”的问题,这让我意识到,设备的安全状态直接影响关键资产的访问权限。因此,我在开发中增加了对设备锁屏状态的检查逻辑,确保在更新或查询关键资产时,设备处于适当的安全状态。

另外,我也意识到权限管理的重要性。在实际操作中,需要申请合适的权限,例如ohos.permission.STORE_PERSISTENT_DATA,否则会收到权限拒绝的错误(错误码201)。为了确保系统能够正确申请并获取这些权限,我在应用启动时增加了权限检查和申请的流程。这些细节虽然看似琐碎,但在确保应用正常运行和用户数据安全方面起到了至关重要的作用。

权限与安全性考量

在实现这些功能时,我深刻感受到权限管理在开发中的重要性。鸿蒙系统对关键资产存储的权限要求非常严格,需要明确申请并获得相应权限。例如,在添加或更新关键资产时,如果没有获得ohos.permission.STORE_PERSISTENT_DATA权限,系统会直接拒绝操作。这些权限的管理不仅仅是技术实现上的问题,更涉及到用户数据的隐私和安全。

因此,在实现过程中,我不仅加入了权限申请逻辑,还向用户提供了明确的权限请求说明,帮助用户理解为什么需要这些权限。这样做既符合系统要求,也有助于增强用户对应用的信任。

最终成果与感悟

最终,我成功实现了关键资产的存储、更新和查询功能,并在项目演示中得到了老板的认可。这次开发让我对HarmonyOS的安全模块有了更深入的理解,也对系统权限管理、设备锁屏状态等安全机制有了更多的认识。

通过这次任务,我深刻体会到鸿蒙生态系统对安全的重视程度。每一个接口调用,每一个错误码的处理,都是在保障用户数据的安全。虽然开发过程充满了挑战,但也让我倍感成就。

在整个开发过程中,我学会了如何有效处理系统权限、如何优化数据查询,以及如何通过安全机制保护用户的敏感信息。这些技能不仅在本次开发中得到了应用,也为我未来的开发工作打下了坚实的基础。

老板后来对我说:“很好,这个功能上线后会给用户提供更多的安全保障。”我笑了笑,觉得所有的努力都是值得的。看到系统成功运行,并为用户提供可靠的数据安全保护,我感到无比自豪。这次经历让我更加明白,开发人员不仅仅是在编写代码,更是在为用户的安全和体验负责。每一个细节的完善,都会对用户产生深远的影响,而这些细节就是我们作为开发者真正的价值所在。

从这次项目中,我也看到了鸿蒙生态的巨大潜力。它的安全模块设计严谨、接口丰富,给了我们开发者很大的发挥空间。而如何在这些技术基础上开发出符合用户需求、安全可靠的应用,正是我们需要不断探索和前进的方向。

image.png


郝敬学
22 声望1 粉丝