MD5在线加密 核心JS实现

简介: 本工具基于纯JS实现MD5在线加密,支持文本/文件输入,统一转为字节序列后计算MD5。兼容text/base64/hex等多种格式解析,输出可选hex(含空格分隔)、base64及大小写切换,文件支持分片读取与进度显示。

MD5在线加密 核心JS实现

这篇只讲本工具的核心 JavaScript:把“文本/文件”统一转换成字节序列,计算 MD5,再按用户选择的格式输出。

在线工具网址:https://see-tool.com/md5-encryptor
工具截图:
工具截图.png

1)整体数据流:输入 -> 字节 -> MD5 -> 输出

工具的主流程可以概括成四步:

  1. 根据输入格式把内容解析成 Uint8Array
  2. 使用增量 MD5 计算器得到 32 位十六进制摘要字符串
  3. 把十六进制摘要再转换回字节(统一到同一套输出格式化)
  4. hex / hex-space / base64 输出,并可选大写

核心原因是:无论输入来自文本还是文件,最终都要落到“字节”这个中间态,才能保证行为一致。

2)输入解析:parseInput(text, format)

输入格式支持 text / base64 / hex / hex-space,解析函数的目标是:返回一个“要参与 MD5 的字节数组”。

2.1 文本:TextEncoder 直接转 UTF-8 字节

case 'text':
  return new TextEncoder().encode(text)

这里把字符串编码为 UTF-8 字节,确保中文、Emoji 等多字节字符也能稳定计算。

2.2 Base64:atob 还原字节

case 'base64': {
   
  const binaryString = atob(text.replace(/\s/g, ''))
  const bytes = new Uint8Array(binaryString.length)
  for (let i = 0; i < binaryString.length; i++) {
   
    bytes[i] = binaryString.charCodeAt(i)
  }
  return bytes
}

关键点:Base64 输入会先清理空白字符,兼容多行粘贴;atob 的结果是“单字节字符串”,需要逐字节转为 Uint8Array

2.3 Hex:去空白 + 校验 + 每两位转一个字节

case 'hex': {
   
  const hex = text.replace(/\s/g, '')
  if (!/^[0-9a-fA-F]*$/.test(hex)) {
   
    throw new Error('invalid hex')
  }
  const bytes = new Uint8Array(hex.length / 2)
  for (let i = 0; i < hex.length; i += 2) {
   
    bytes[i / 2] = parseInt(hex.substr(i, 2), 16)
  }
  return bytes
}

这段实现把十六进制视为“连续的字节流”,中间允许插入空格/换行;只要字符集不在 [0-9a-fA-F] 就直接判错。

2.4 Hex(空格分隔):按 token 解析

case 'hex-space': {
   
  const parts = text.trim().split(/\s+/)
  const bytesArray = new Uint8Array(parts.length)
  for (let i = 0; i < parts.length; i++) {
   
    if (!/^[0-9a-fA-F]{1,2}$/.test(parts[i])) {
   
      throw new Error('invalid hex token')
    }
    bytesArray[i] = parseInt(parts[i], 16)
  }
  return bytesArray
}

这种格式适合处理“每个字节之间用空格分隔”的数据(例如抓包或调试输出)。每个 token 允许 1~2 位十六进制。

3)MD5 计算:统一用 SparkMD5.ArrayBuffer

工具用 spark-md5 做 MD5 计算。它的 ArrayBuffer 版本支持“追加数据”计算,既能处理文本输入,也能用于文件分片。

3.1 文本模式:Uint8Array 直接参与计算

const calculateMD5 = (bytes) => {
   
  const spark = new SparkMD5.ArrayBuffer()
  spark.append(bytes)
  const hashHex = spark.end()
  return hexToBytes(hashHex)
}

实现里会把最终的 hashHex 再转回字节数组,目的是把“输出格式化”统一为对字节数组操作(hex、base64 都能复用同一套逻辑)。

3.2 十六进制摘要转字节:hexToBytes

const hexToBytes = (hex) => {
   
  const bytes = new Uint8Array(hex.length / 2)
  for (let i = 0; i < hex.length; i += 2) {
   
    bytes[i / 2] = parseInt(hex.substr(i, 2), 16)
  }
  return bytes
}

MD5 的摘要是 16 字节(32 个十六进制字符),转换后就是固定长度的 Uint8Array(16)

4)输出格式化:formatOutput(bytes, format)

输出支持:

  • hex:连续 32 位十六进制
  • hex-space:每个字节用空格分隔
  • base64:对 16 字节摘要做 Base64

4.1 先把字节拼成十六进制串

const hexString = Array.from(bytes)
  .map(b => b.toString(16).padStart(2, '0'))
  .join('')

有了 hexStringhexhex-space 都只是在展示层做不同分割。

4.2 hex 与大写开关

case 'hex':
  return uppercase.value ? hexString.toUpperCase() : hexString

4.3 hex-space:每两位插空格

case 'hex-space': {
   
  const hex = uppercase.value ? hexString.toUpperCase() : hexString
  return hex.match(/.{2}/g).join(' ')
}

4.4 base64:字节转“单字节字符串”再 btoa

case 'base64': {
   
  const binaryString = String.fromCharCode.apply(null, bytes)
  return btoa(binaryString)
}

这里的 Base64 输出是“对 MD5 摘要(16 字节)”编码后的结果。

5)文件模式:分片读取 + 增量追加

文件模式的核心是:用 FileReader.readAsArrayBuffer 读取文件切片,并把每一片追加到同一个 SparkMD5.ArrayBuffer() 实例中。

const processFile = (file) => {
   
  fileProgress.value = 0
  const reader = new FileReader()
  const chunkSize = 2 * 1024 * 1024
  let offset = 0
  const spark = new SparkMD5.ArrayBuffer()

  const readNextChunk = () => {
   
    const slice = file.slice(offset, offset + chunkSize)
    reader.readAsArrayBuffer(slice)
  }

  reader.onload = (e) => {
   
    const arrayBuffer = e.target.result
    spark.append(arrayBuffer)

    offset += arrayBuffer.byteLength
    fileProgress.value = Math.round((offset / file.size) * 100)

    if (offset < file.size) {
   
      readNextChunk()
    } else {
   
      const hashHex = spark.end()
      const hashBytes = hexToBytes(hashHex)
      hashResult.value = formatOutput(hashBytes, outputFormat.value)
      fileProgress.value = 0
    }
  }

  reader.onerror = () => {
   
    fileProgress.value = 0
  }

  readNextChunk()
}

这段逻辑只做三件事:

  1. 读取切片得到 ArrayBuffer
  2. 追加到 spark
  3. 读完后统一走 formatOutput 输出

进度条的百分比来自 offset / file.size 的比例计算。

6)入口调度:generateHash() 把两种模式收口

工具的“生成”按钮只需要根据当前 tab 分流:

const generateHash = () => {
   
  if (activeTab.value === 'file') {
   
    if (!selectedFile) return
    processFile(selectedFile)
    return
  }

  if (!inputText.value) return

  const bytes = parseInput(inputText.value, inputFormat.value)
  const hashBytes = calculateMD5(bytes)
  hashResult.value = formatOutput(hashBytes, outputFormat.value)
}

到这里,文本与文件的差异只剩下“如何拿到输入字节”,后续的 MD5 计算与输出格式化完全复用同一套函数。

目录
相关文章
|
23天前
|
存储 自然语言处理 安全
MD5在线加密工具分享
一款基于Nuxt 3开发的MD5在线校验工具,支持文本(含Base64/Hex等格式)与文件(拖拽上传、本地分片计算)快速生成MD5摘要,输出可选Hex/Base64等格式并一键转大写。全程浏览器端处理,隐私安全,专为文件完整性校验设计。
497 2
|
存储 Java 数据库
若依框架----源码分析(@Log)
若依框架----源码分析(@Log)
3472 1
|
23天前
|
人工智能 API 开发者
藏不住了!阿里云Coding Plan重磅上线四大模型,7.9元就能玩转AI
阿里云Coding Plan上线Qwen3.5、GLM-5、MiniMax M2.5、Kimi K2.5四大顶级开源模型,Lite套餐首月仅7.9元,享1.8万次请求;Pro套餐39.9元/月,支持复杂编码任务。支持Qwen Code等多工具切换,高稳定、高Token额度。(239字)
|
23天前
|
人工智能 API 开发者
终于等到!阿里云Coding Plan上线Qwen3.5/GLM-5/MiniMax/Kimi,一键自由切换
阿里云Coding Plan上线Qwen3.5、GLM-5、MiniMax M2.5、Kimi K2.5四大顶流开源模型,支持Qwen Code等工具一键切换。Lite/Pro套餐首月仅7.9/39.9元,享高稳定、高Token额度服务,助力高效编程与智能体开发。(239字)
583 3
|
12天前
|
JavaScript
HTTP状态查询 在线工具分享
遇到网页打不开、跳转异常或报错?试试「HTTP状态查询」在线工具!无需安装,输入网址即可秒查状态码(200/301/404/500等)、跳转路径、响应头及耗时,帮普通用户快速定位问题。简洁直观,一看就懂!
139 5
|
23天前
|
人工智能 监控 安全
阿里云3步部署OpenClaw 24小时在线AI助手及50+OpenClaw 核心Skills使用指南分享
在AI智能体工具飞速普及的2026年,OpenClaw(原Clawdbot、Moltbot)凭借开源灵活的特性成为个人与轻量办公群体的首选,但安全风险也随之而来——2026年2月爆发的ClawHavoc事件中,ClawHub插件市场查出341个恶意技能(占比达12%),让无数用户意识到“技能选择”与“安全配置”远比功能堆砌更重要。官方内置的53个技能经过严格安全校验,是最可靠的选择,而阿里云的稳定部署环境与Molili本土化工具,则完美解决了OpenClaw默认适配海外生态、部署复杂的痛点。
685 1
|
23天前
|
安全 应用服务中间件 网络安全
2026年OpenClaw Docker生产环境部署指南:附阿里云1分钟安装OpenClaw+单机架构全流程
2026年,由奥地利开发者Peter Steinberger主导开发的OpenClaw AI执行引擎(曾用名Clawdbot、Moltbot)凭借“从给建议到做事情”的核心能力爆火开源领域,GitHub星标数突破18.6万,成为全球增速最快的开源项目之一。与传统对话式AI不同,OpenClaw定位“本地运行、可自托管的数字员工”,支持接入Claude、GPT、Ollama等主流大模型,兼容钉钉、飞书等十余种通讯渠道,通过技能插件无限扩展能力边界,覆盖办公自动化、代码辅助、跨应用协同等全场景,且基于MIT协议开源,支持免费使用与私有化部署。
2010 1
|
Docker 容器
docker容器查看所有没使用的镜像,并删除
docker容器查看所有没使用的镜像,并删除
1859 0
|
编译器 C#
C#中内置的泛型委托Func与Action
C#中内置的泛型委托Func与Action
411 4
|
关系型数据库 MySQL 数据库
在 MySQL 中使用 Alter Table
【8月更文挑战第11天】
2527 0
在 MySQL 中使用 Alter Table