鸿蒙MD5工具开发笔记 - crypto-js三方库使用实践

架构师手记
• 阅读 3

鸿蒙MD5工具开发笔记 - crypto-js三方库使用实践

基础知识

MD5这玩意其实挺简单的,就是用来算哈希值的。我刚开始接触的时候也是一脸懵逼,后来用多了就明白了。

  1. 是啥
    • 就是个哈希算法,把任意长度的数据变成固定长度的字符串
    • 输出32位字符串,看起来像这样: 5d41402abc4b2a76b9719d911017c592
    • 算完就回不去了,想从MD5值反推出原文是不可能的
    • 主要用来校验,比如下载文件后算一下MD5,看看文件有没有损坏
  2. 干啥用
    • 校验文件完整性,下完文件算一下MD5,对比一下就知道文件有没有损坏
    • 存密码,现在很多网站都用MD5存密码,不过现在不太安全了
    • 签名,可以用来生成数字签名
    • 去重,可以用来判断文件是否重复
  3. 特点
    • 输出长度固定,都是32位
    • 算得快,比SHA256快多了
    • 不容易撞,虽然理论上可能碰撞,但实际很难
    • 算完就回不去了,这是它的优点也是缺点
  4. 啥时候用
    • 下文件校验,特别是大文件
    • 存密码,不过现在建议用更安全的算法
    • 签名,生成数字签名
    • 去重,判断文件是否重复

前言

最近在搞鸿蒙工具箱,想着加个MD5工具。这玩意主要是用来算文本或文件的MD5值,方便校验文件完整性。本来以为挺简单的,结果发现要处理各种边界情况,调试了好几次才搞定。

写这个工具的时候遇到不少坑,比如中文编码问题,大文件内存问题,性能问题等等。不过最后都解决了,现在用起来还挺顺手的。

一、功能说明

1.1 主要功能

  • 算MD5,支持文本和文件
  • 大小写切换,方便复制
  • 复制结果,一键复制
  • 收藏功能,方便下次用

1.2 界面功能

  • 输入框,可以输入文本
  • 大小写开关,切换大小写
  • 计算按钮,开始计算
  • 结果显示,显示结果
  • 复制按钮,复制结果

二、实现过程

2.1 三方库使用

2.1.1 安装crypto-js

首先得安装crypto-js这个库,我用的是ohpm安装的。具体步骤:

  1. 打开终端,进入项目目录
cd harmonyos-developer-toolbox
  1. 安装crypto-js
ohpm install @ohos/crypto-js
  1. 等待安装完成,会看到类似这样的输出:
[ohpm] Installing @ohos/crypto-js...
[ohpm] Successfully installed @ohos/crypto-js
  1. 检查oh-package.json5,会看到新增了依赖:
{
  "dependencies": {
    "@ohos/crypto-js": "^1.0.0"
  }
}
  1. 如果安装失败,可以试试:
ohpm cache clean
ohpm install @ohos/crypto-js --force
  1. 安装完成后,需要重新构建项目:
ohpm build
  1. 如果遇到版本冲突,可以在oh-package.json5中指定版本:
{
  "dependencies": {
    "@ohos/crypto-js": "1.0.0"  // 指定具体版本
  }
}

2.1.2 使用crypto-js

安装好了就可以用了,主要用到了这些:

  1. 引入
import CryptoJS from '@ohos/crypto-js'
  1. 主要API
// 算MD5
CryptoJS.MD5(text)

// 转字符串
hash.toString()

// 转大写
result.toUpperCase()
  1. 注意点
    • 空输入要处理,不然会报错
    • 异常要处理,比如编码问题
    • 编码要处理,特别是中文
    • 性能要处理,大文件要分块

2.2 代码实现

@Entry
@Component
struct Md5Tool {
  @State private inputText: string = '';    // 输入文本
  @State private md5Result: string = '';    // MD5结果
  @State private isUpperCase: boolean = false;  // 是否大写
  @State private isProcessing: boolean = false;  // 是否正在算

  // 算MD5
  private async calculateMd5(): Promise<void> {
    if (!this.inputText) {
      await promptAction.showToast({ message: '请输入要计算的文本' });
      return;
    }

    try {
      this.isProcessing = true;
      // 用 CryptoJS 算 MD5
      const hash = CryptoJS.MD5(this.inputText);
      let result = hash.toString();

      if (this.isUpperCase) {
        result = result.toUpperCase();
      }

      this.md5Result = result;
      await promptAction.showToast({ message: '算好了' });
    } catch (err) {
      console.error('算失败了:', err);
      await promptAction.showToast({ message: '算失败了' });
    } finally {
      this.isProcessing = false;
    }
  }
}

三、踩坑记录

3.1 遇到的问题

  1. 性能问题
    • 问题:大文本算得慢,特别是中文
    • 解决:加了进度提示,让用户知道在算
    • 建议:分块算,别一次性算完
  2. 编码问题
    • 问题:中文乱码,算出来的结果不对
    • 解决:统一用UTF-8,保证编码一致
    • 建议:算前先转码,避免编码问题
  3. 内存问题
    • 问题:大文件内存爆了,直接OOM
    • 解决:流式处理,边读边算
    • 建议:分批处理,别一次性读太多
  4. 错误处理
    • 问题:算失败没提示,用户不知道咋回事
    • 解决:加了错误提示,告诉用户失败原因
    • 建议:加个日志,方便排查问题

3.2 优化建议

  1. 功能优化
    • 支持文件计算,现在只能算文本
    • 加个历史记录,方便查看历史
    • 支持批量计算,一次算多个
    • 加个校验功能,对比两个MD5
    • 支持拖拽,直接拖文件进来
    • 加个进度条,显示计算进度
    • 支持导出,导出计算结果
    • 加个对比,对比两个结果
  2. 性能优化
    • 优化计算速度,现在有点慢
    • 减少内存占用,大文件会爆
    • 及时释放资源,避免内存泄漏
    • 用多线程,提高计算速度
    • 优化算法,减少计算量
    • 缓存结果,避免重复计算
    • 压缩数据,减少内存占用
    • 异步处理,避免卡顿
  3. 用户体验
    • 加个使用说明,告诉用户咋用
    • 支持快捷键,提高效率
    • 优化动画效果,看起来更流畅
    • 加个主题,支持暗黑模式
    • 支持分享,分享计算结果
    • 加个收藏,收藏常用结果
    • 支持导入,导入历史记录
    • 加个备份,备份设置

四、总结

这个MD5工具基本功能都有了,可以:

  • 算文本MD5,支持中文
  • 校验文件,看看文件有没有损坏
  • 生成签名,生成数字签名
  • 学习加密,了解加密原理

五、参考资料

欢迎体验

这个MD5工具已经集成到鸿蒙开发者工具箱里了,欢迎下载体验!

鸿蒙开发者工具箱


作者:在人间耕耘 邮箱:1743914721@qq.com 版权声明:本文为原创文章

点赞
收藏
评论区
推荐文章
V-275670029 V-275670029
2年前
哈希竞猜游戏的开发搭建原理
hash哈希竞猜游戏软件开发哈希竞猜游戏系统搭建区块链主要应用的密码学算法有两个部分:一个哈希算法,另一个是非对称加密  简单来说,哈希算法就是一种特殊的函数,不论输入多长的一串字符,只要通过这个函数都可以得到一个固定长度的输出值,这就好像身份证号码一样,永远都是十八位而且全国唯一。哈希算法的输出值就叫做哈希值。  哈希算法有三个特点,它们赋予了区块链不可
Stella981 Stella981
3年前
Android常见的加密和算法
1.不可逆的算法主要为MD5和SHA1算法。(二者都不属于加密只能算作一种算法)相同点:都是使用目前比较广泛的散列(Hash)函数,就是把任意长度的输入,变换成固定长度的输出,该输出就是散列值。计算的时候所有的数据都参与了运算,其中任何一个数据变化了都会导致计算出来的Hash值完全不同。(理论上来讲产生的密文都有可能产生碰撞)不同点:M
Wesley13 Wesley13
3年前
MD5 SHA1 HMAC HMAC_SHA1区别
MD5是一种不可逆的加密算法,目前是最牢靠的加密算法之一,尚没有能够逆运算的程序被开发出来,它对应任何字符串都可以加密成一段唯一的固定长度的代码。SHA1是由NISTNSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(bruteforce)性更好。HMAC\_SHA1  
Stella981 Stella981
3年前
ShortUrl Hash的实现
shorturl实现常见的做法都是将原始Url存储到数据库,由数据库返回一个对应ID。以下要实现的是不用数据库支持就对原始URL进行shorturlhash。说到这里我们很容易想到MD5,固定长度,冲突概率小,但是32个字符,太长?我们以MD5为基础,将其字符缩短,同时要保证一定数量范围内hash不会冲突。我们分成两个步骤来实现。第一步算法:
Wesley13 Wesley13
3年前
1.8 可变、不可变数据与hash
HASH   Hash,一般翻译做'散列',也有直接音译为'哈希'的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转化是一种压缩映射,也就是,散列值得空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一确定输入值。简单的说就是一种将任意长度的消息压
搭建平台吧 搭建平台吧
2年前
哈希竞猜搭建部署方案
首先,什么是哈希?哈希是将任意长的输入编程加密的固定长度输出的过程。哈希并不等同于加密方法,因为无法解密哈希值来获取原始数据。事实上哈希是一种单向加密函数。有了哈希函数,就可以将互联网上的数据以固定长度字符串的形式来保存。其中一种方法就是SHA256(安全哈希算法256位),SHA256是SHA1的后继者,SHA1的输出是160位的。哈希游戏的亮点:100%
V-275670029 V-275670029
2年前
哈希竞猜游戏是什么?
区块链主要应用的密码学算法有两个部分:一个哈希算法,另一个是非对称加密  简单来说,哈希算法就是一种特殊的函数,不论输入多长的一串字符,只要通过这个函数都可以得到一个固定长度的输出值,这就好像身份证号码一样,永远都是十八位而且全国唯一。哈希算法的输出值就叫做哈希值。  哈希算法有三个特点,它们赋予了区块链不可篡改、匿名等特性,并保证了整个区块链体系的完整。第
V-275670029 V-275670029
2年前
哈希竞猜游戏的原理
Hash一般被翻译成“散列”,也可直接音译为“哈希”,就是把任意长度的输入(又叫做预映射,preimage),通过散列算法,变换成固定长度的输出,该输出就是散列值。  这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消
哈希游戏的特点
我们可以简单认为哈希值就是将“账页信息”进行哈希算法,计算得到一串字符密码,那么哈希算法就是区块链保证交易信息不被篡改的单向密码机制。哈希算法在接收一段明文(也就是账页信息)后,以一种不可逆的方式将其转化为一段长度较短、位数固定的散列数据。Hash函数的特点哈希(Hash)函数具有如下特点。易压缩:对于任意大小的输入x,Hash值的长度很小,在实际应用中,函
哈希竞猜搭建
我整理了一下:哈希竞猜游戏开发原理。哈希区块链的搭建原理。哈希值的应用和定义哈希值就是文件的身份证,不过比身份证还严格。他是根据文件大小,时间,类型,创作着,机器等计算出来的,很容易就会发生变化,谁也不能预料下一个号码是多少,也没有更改他的软件。哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧
架构师手记
架构师手记
Lv1
就算步伐很小,也要步步前进。
文章
2
粉丝
0
获赞
0