当前位置: 首页 > news >正文

前端实现 MD5 加密

在前端开发中,经常需要对用户输入或敏感数据进行哈希处理,以增强安全性和完整性校验。MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希算法,可以将任意长度的数据转换为 128 位(32 字符)的十六进制字符串。

一、引入 CryptoJS 库

使用CryptoJS:https://github.com/brix/crypto-js 可以在浏览器端轻松完成 MD5 计算。首先在页面中通过 CDN 引入该库:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>MD5 示例</title><script src="https://cdn.jsdelivr.net/npm/crypto-js@4.1.1/crypto-js.min.js"></script>
</head>
<body><div><input type="text" id="inputText" placeholder="请输入需加密内容" /><button id="btnHash">生成MD5</button><p>结果:<span id="result"></span></p></div><script>const inputText = document.getElementById('inputText');const btnHash = document.getElementById('btnHash');const result = document.getElementById('result');btnHash.addEventListener('click', () => {const value = inputText.value;const hash = CryptoJS.MD5(value).toString();result.textContent = hash;});</script>
</body>
</html>

二、纯 JavaScript 实现

如果不想依赖外部库,也可以使用纯 JavaScript 实现 MD5 算法。以下示例为精简版实现:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>纯 JS MD5</title>
</head>
<body><div><input id="inputText" /><button id="btnHash">生成MD5</button><p>结果:<span id="result"></span></p></div><script>function md5cycle(x, k) {let a = x[0], b = x[1], c = x[2], d = x[3];function ff(a, b, c, d, x, s, t) {a = (a + ((b & c) | (~b & d)) + x + t) | 0;return ((a << s) | (a >>> (32 - s))) + b | 0;}function gg(a, b, c, d, x, s, t) {a = (a + ((b & d) | (c & ~d)) + x + t) | 0;return ((a << s) | (a >>> (32 - s))) + b | 0;}function hh(a, b, c, d, x, s, t) {a = (a + (b ^ c ^ d) + x + t) | 0;return ((a << s) | (a >>> (32 - s))) + b | 0;}function ii(a, b, c, d, x, s, t) {a = (a + (c ^ (b | ~d)) + x + t) | 0;return ((a << s) | (a >>> (32 - s))) + b | 0;}a = ff(a, b, c, d, k[0], 7, -680876936);d = ff(d, a, b, c, k[1], 12, -389564586);c = ff(c, d, a, b, k[2], 17, 606105819);b = ff(b, c, d, a, k[3], 22, -1044525330);a = gg(a, b, c, d, k[1], 5, -165796510);d = gg(d, a, b, c, k[6], 9, -1069501632);c = gg(c, d, a, b, k[11], 14, 643717713);b = gg(b, c, d, a, k[0], 20, -373897302);a = hh(a, b, c, d, k[5], 4, -378558);d = hh(d, a, b, c, k[8], 11, -2022574463);c = hh(c, d, a, b, k[11], 16, 1839030562);b = hh(b, c, d, a, k[14], 23, -35309556);a = ii(a, b, c, d, k[0], 6, -198630844);d = ii(d, a, b, c, k[7], 10, 1126891415);c = ii(c, d, a, b, k[14], 15, -1416354905);b = ii(b, c, d, a, k[5], 21, -57434055);x[0] = x[0] + a | 0;x[1] = x[1] + b | 0;x[2] = x[2] + c | 0;x[3] = x[3] + d | 0;}function md5blk(str) {const md5blks = [];for (let i = 0; i < 64; i += 4) {md5blks[i >> 2] = str.charCodeAt(i)+ (str.charCodeAt(i + 1) << 8)+ (str.charCodeAt(i + 2) << 16)+ (str.charCodeAt(i + 3) << 24);}return md5blks;}function md51(str) {const n = str.length;const state = [1732584193, -271733879, -1732584194, 271733878];let i;for (i = 64; i <= n; i += 64) {md5cycle(state, md5blk(str.slice(i - 64, i)));}str = str.slice(i - 64);const tail = Array(16).fill(0);for (i = 0; i < str.length; i++) {tail[i >> 2] |= str.charCodeAt(i) << ((i % 4) << 3);}tail[i >> 2] |= 0x80 << ((i % 4) << 3);if (i > 55) {md5cycle(state, tail);tail.fill(0);}tail[14] = n * 8;md5cycle(state, tail);return state;}function rhex(n) {let s = '';for (let j = 0; j < 4; j++) {s += ('0' + ((n >> (j * 8 + 4)) & 0x0F).toString(16)).slice(-2)+ ('0' + ((n >> (j * 8)) & 0x0F).toString(16)).slice(-2);}return s;}function md5(str) {const arr = md51(str);return arr.map(rhex).join('');}const input = document.getElementById('inputText');const button = document.getElementById('btnHash');const output = document.getElementById('result');button.addEventListener('click', () => {output.textContent = md5(input.value);});</script>
</body>
</html>
http://www.dtcms.com/a/273831.html

相关文章:

  • 【Linux应用】Ubuntu20.04 aarch64开发板一键安装ROS2(清华源)
  • 登录超时问题的排查方法与预防经验分享
  • 【机器学习】机器学习基础
  • 设计模式笔记_结构型_代理模式
  • GPT3/chatGPT/T5/PaLM/LLaMA/GLM主流大语言模型的原理和差异
  • 触觉反馈手套技术是迈向远程机器人系统灵巧操作的关键一步
  • 【Linux】系统引导修复
  • 【八股消消乐】浅尝Kafka性能优化
  • 服务器机柜与网络机柜各自的优势
  • 微信小程序111~120
  • 十二、k8s工程化管理Helm
  • Docker部署私有仓库
  • Linux_3:进程间通信
  • 全面掌控 Claude Code:命令 + 参数 + 快捷键一文全整理(建议收藏)
  • DVWA靶场通关笔记-反射型XSS(Reflected Medium级别)
  • react打包发到线上报错Minified React error #130
  • 在HP小机上跑了1432天的Oracle RAC,能不能重启?
  • 【ECharts】多个ECharts版本共存解决方案
  • 日历插件-FullCalendar的详细使用
  • git lfs部署及报错处理
  • 静态路由综合配置实验报告
  • 如何安装和配置Autoptimize插件以提高WordPress网站访问速度
  • Web应用文件上传安全设计指南
  • Redis概念和基础
  • Apache Cloudberry 向量化实践(二):如何识别和定位向量化系统的性能瓶颈?
  • Django 模板(Template)
  • 你会用Github Copilot 吗 ——《内置功能详解》
  • h2数据库数据文件备份(防止异常断电导致的数据库文件无法使用,元数据块损坏等问题)
  • Oracle RAC 11.2.0.4 更新SYSASM和SYS密码
  • Oracle字符类型详解:VARCHAR、VARCHAR2与CHAR的区别