HarmonyOS 鸿蒙Next中UnitTest对MD5不支持

HarmonyOS 鸿蒙Next中UnitTest对MD5不支持 最近在使用单元测试,需要用到MD5,编写单元测试代码如下:

import { describe, it } from '@ohos/hypium';
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { buffer } from '@kit.ArkTS';

export default function localUnitTest() {
  describe('localUnitTest', () => {
    it('doMdBySync', 0, () => {
      doMdBySync()
    });
  });
}

function doMdBySync() {
  let mdAlgName = 'MD5'; // 摘要算法名。
  let message = 'mdTestMessage'; // 待摘要的数据。
  let md = cryptoFramework.createMd(mdAlgName);
  // 数据量较少时,可以只做一次update,将数据全部传入,接口未对入参长度做限制。
  md.updateSync({ data: new Uint8Array(buffer.from(message, 'utf-8').buffer) });
  let mdResult = md.digestSync();
  console.info('[Sync]:Md result:' + mdResult.data);
  let mdLen = md.getMdLength();
  console.info("md len: " + mdLen);
}

其中 doMdBySync() 函数 来自于:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/crypto-generate-message-digest-md5

执行单元测试,输出结果为:

[Sync]:Md result: md len: 0

想知道如何在单元测试中,使用MD5相关方法


更多关于HarmonyOS 鸿蒙Next中UnitTest对MD5不支持的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

开发者你好,经测试,你提供的代码放在Test下可以复现问题。Local Test支持ArkTS语言,仅支持Stage模型,没法测试C/C++方法及系统API。参考以下解决方案:

【解决方案】

可以将测试用例放在ohosTest/ets/test文件夹下,我在本地测试你提供的代码是可以正常运行的。日志如下:

01-07 15:47:48.636   15567-15567   A03d00/JSAPP                     I     [Sync]:Md result:109,210,16,71,133,124,217,182,218,121,216,22,225,159,185,97

01-07 15:47:48.636   15567-15567   A03d00/JSAPP                     I     md len: 16

更多关于HarmonyOS 鸿蒙Next中UnitTest对MD5不支持的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


我也一样cke_242.png

核心原因

  1. 环境层面(关键):本地单元测试运行在 PC 端的 ArkTS 模拟环境,缺少 HarmonyOS 系统底层的加密驱动,cryptoFramework.createMd('MD5')返回的是 “空实例”—— 既无法计算有效摘要,也会导致getMdLength()返回 0。只有在真机 / 模拟器上运行的设备单元测试,才能调用鸿蒙原生的加密接口。
  2. 代码层面:MD5 计算结果是Uint8Array类型,直接拼接字符串打印会显示为空,需转为 16 进制才能看到有效结果;同时未校验 MD5 实例是否创建成功,存在空指针风险。

鸿蒙Next的UnitTest框架目前不支持MD5算法。这是由于鸿蒙系统安全策略限制,禁止使用不安全的加密算法。MD5因其碰撞漏洞已被视为不安全,不符合鸿蒙的安全规范。在UnitTest中调用相关接口会返回错误或抛出异常。

在HarmonyOS Next的单元测试环境中,cryptoFramework.createMd('MD5') 返回的MD实例其 digestSync() 方法可能返回空数据,getMdLength() 返回0,这通常表明在当前的单元测试沙箱或模拟器环境下,MD5算法可能未被完整支持或存在限制。

核心问题与直接解决方案:

  1. 环境限制:单元测试(特别是本地测试)可能运行在一个受限的、非完整的系统模拟环境中,某些系统级加密服务(如特定的摘要算法)可能不可用或行为与真机/模拟器不同。

  2. 使用替代的、受支持的摘要算法:HarmonyOS Next的 cryptoFramework 明确支持更安全的摘要算法,如 SHA-256。在单元测试中,应优先使用这些受保障的算法。

    • 修改代码:将 mdAlgName'MD5' 改为 'SHA256'
    let mdAlgName = 'SHA256'; // 使用受支持的SHA-256算法
    

    这能确保你的摘要功能逻辑在单元测试中可验证,且更符合当前的安全实践。

  3. 验证逻辑而非特定算法:如果测试目的是验证“摘要功能流程”(创建、更新、摘要),使用SHA-256等受支持的算法完全能达到目的。如果必须测试MD5相关代码路径(例如遗留代码兼容),则需注意:

    • 该行为可能是单元测试框架的已知限制。
    • 考虑将涉及MD5的测试标记为在特定环境(如真机)下运行,而非本地单元测试。

总结:在HarmonyOS Next单元测试中遇到MD5返回空结果时,最直接有效的方法是将算法替换为框架明确支持的SHA-256等。这既能保证测试通过,也遵循了更优的安全规范。如果你的业务逻辑强依赖MD5且必须在测试中验证,需要关注其在不同测试环境下的兼容性差异。

回到顶部