1

最近,我们公司开始探索鸿蒙系统的开发,老板拍了拍我的肩膀,对我说:“你去看看能不能把加密模块做出来,我们准备用鸿蒙的 HUKS 做个安全存储。”我一边点头,一边心里一紧,HUKS?这玩意儿怎么用来着?不过既然是任务,咱们还是撸起袖子干。

image.png

头脑风暴与官方文档

刚拿到任务的我,第一反应就是去看鸿蒙的官方文档。HUKS(HarmonyOS Universal Key Store)看起来是一个加密操作的万能库,可以做密钥管理、加密、解密、签名等一堆事。说实话,文档写得还算详细,但有些地方着实有点抽象。我的目标是,怎么用它来生成密钥、加密数据、然后再把这些数据解密回来。

看着官方文档,我心里默念,“说得这么简单,实操起来估计不那么顺利。”不过,挑战不就是这样有意思嘛!

image.png

开始搞——生成密钥

第一步是生成密钥。按照文档,我们需要用到 huks.generateKey() 这个方法。文档里提到了需要配置密钥参数,比如算法类型(AES、RSA 等等),密钥长度,还有使用场景。

我写下了第一段代码:

import huks from '@ohos.security.huks';

async function generateKey() {
  try {
    const options = {
      properties: [
        { tag: huks.HuksTag.HUKS_TAG_ALGORITHM, value: huks.HuksKeyAlg.HUKS_ALG_AES },
        { tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, value: 256 },
        { tag: huks.HuksTag.HUKS_TAG_PURPOSE, value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT | huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT },
      ]
    };
    await huks.generateKey('myKeyAlias', options);
    console.log('密钥生成成功!');
  } catch (err) {
    console.error('生成密钥失败:', err);
  }
}

generateKey();

这段代码的意思是,生成一个 256 位的 AES 密钥,用于加密和解密。我设置了密钥别名为 myKeyAlias,这样我们可以后面直接使用这个别名进行加密解密操作。

运行的时候,我紧张得不行,生怕代码跑不通。结果,控制台弹出一行“密钥生成成功!”让我内心一阵小雀跃。嘿,第一步搞定了!

加密数据

接下来就是加密数据的部分了。加密往往是为了保护敏感信息,在我们的项目中,用户的某些个人数据需要保密存储。文档说我们可以使用 huks.encrypt() 方法来实现。

于是我写下了加密的代码:

async function encryptData() {
  try {
    const data = 'Hello HarmonyOS!';
    const input = new Uint8Array(Buffer.from(data));
    const options = {
      properties: [
        { tag: huks.HuksTag.HUKS_TAG_ALGORITHM, value: huks.HuksKeyAlg.HUKS_ALG_AES },
        { tag: huks.HuksTag.HUKS_TAG_PURPOSE, value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT },
        { tag: huks.HuksTag.HUKS_TAG_KEY_ALIAS, value: 'myKeyAlias' },
      ]
    };
    const result = await huks.encrypt('myKeyAlias', options, input);
    console.log('加密成功,密文:', result.outData);
    return result.outData;
  } catch (err) {
    console.error('加密失败:', err);
  }
}

encryptData();

加密数据的时候,我第一次看到加密后的密文——一串长长的 Uint8Array,虽然看不懂,但这就是加密的魔力啊!从“Hello HarmonyOS!”到一堆乱码,心里觉得好像为用户的数据多加了一层铠甲。

解密验证

有了加密,自然也要能解密,不然存进去的数据拿不出来那不就白费了吗?我接着实现了解密的逻辑:

async function decryptData(encryptedData) {
  try {
    const options = {
      properties: [
        { tag: huks.HuksTag.HUKS_TAG_ALGORITHM, value: huks.HuksKeyAlg.HUKS_ALG_AES },
        { tag: huks.HuksTag.HUKS_TAG_PURPOSE, value: huks.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT },
        { tag: huks.HuksTag.HUKS_TAG_KEY_ALIAS, value: 'myKeyAlias' },
      ]
    };
    const result = await huks.decrypt('myKeyAlias', options, encryptedData);
    console.log('解密成功,原文:', Buffer.from(result.outData).toString());
  } catch (err) {
    console.error('解密失败:', err);
  }
}

// 假设我们已经有了加密的数据 encryptedData
encryptData().then((encryptedData) => decryptData(encryptedData));

这段代码调用了 decrypt(),用同样的密钥来还原原始数据。看到控制台输出的“Hello HarmonyOS!”时,我终于松了一口气——一套流程走下来是成功的!

老板的认可

一周后,我把这部分功能的 Demo 做好了,跑给老板看。他看了一眼控制台上的输出,点点头说:“还行啊,这个加密模块搞定了,接下来我们可以用在用户数据存储上了。”

我心想,虽然过程不算简单,但看到最终的成果,那些熬夜翻文档、调代码的时光都值了。

总结

其实,用 HUKS 做加密解密并不难,只是中间有一些坑需要耐心踩过去。关键是理解每个 API 需要的参数,还有鸿蒙中一些独有的 tag 和属性。写代码就是这样,有时候一个小小的成功就能让人充满动力。希望我的这个小故事能对你们在鸿蒙开发上的探索有些帮助,也希望我们都能继续在这个新平台上发掘出更多有意思的东西!
关注我~未来给你分享我在鸿蒙上的小故事,帮你踩坑~~~

image.png


郝敬学
22 声望1 粉丝