解决php和crypto.js使用md5加密结果不一致问题

简介: 解决php和crypto.js使用md5加密结果不一致问题

前言


在做 前后端验签时,使用到了md5加密,发现前后端加密结果不统一,导致验签失败。这里总结一下问题原因以及解决方法,以供参考。前端使用到了CryptoJS前端加密库进行加密。

问题复现


为了测试方便,字段remark中使用了很多特殊字符。

前端


代码


    encryMd5() {
      let data = {
        name: "卢俊义",
        age: 25,
        sex: "male",
        remark: "dahsdahda~很~快的()哈肯 定='';:,.,。、??/<>-=-=()()好亏·-=啥多看哈 是道坎!@#¥%……&=*()——+=-·",
      }
      let str = new URLSearchParams(data).toString()
      console.log("query_str", str);
      console.log("md5_str", CryptoJS.MD5(str).toString());
    }

执行结果


前端加密后得到的MD5字符串为:157474853a5d1c06f2607acbd907781d

image.png

后端


代码


  $arr = [
    "name"      =>  "卢俊义",
    "age"       =>  25,
    "sex"       =>  "male",
    "remark"    =>  "dahsdahda~很~快的()哈肯 定='';:,.,。、??/<>-=-=()()好亏·-=啥多看哈 是道坎!@#¥%……&=*()——+=-·",
  ];
  $str = http_build_query($arr);
  echo $str.PHP_EOL;
  echo md5($str).PHP_EOL;

执行结果


后端加密后得到的MD5字符串为:c398fa37f2a8020a7a12c4bfc5027fbe

image.png

结果对比


通过使用Beyond Compare比较发现,是在构建queryString的过程中,前端字符编码时没将*号进行编码。

ec4e2056e53f4712be63590822849e1a.png

解决方案


通过对上一步的结果进行分析可以发现,问题是由于两端编码差异造成的。所以只要对两边编码方式进行统一就好。具体如下:

前端


代码


使用encodeURIComponent对字段值逐一进行编码,并且由于encodeURIComponent不会encode ~!*()等字符,所以要进行补充编码,具体代码如下:

    encryMd5() {
      let data = {
        name: "卢俊义",
        age: 25,
        sex: "male",
        remark: "dahsdahda~很~快的()哈肯 定='';:,.,。、??/<>-=-=()()好亏·-=啥多看哈 是道坎!@#¥%……&=*()——+=-·",
      }
      for (let key in data) {
        data[key] = (data[key] + '').toString();   
        data[key] = encodeURIComponent(data[key]).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').  
          replace(/\)/g, '%29').replace(/\*/g, '%2A')
      }
      console.log("encode_obj", data);
      let str = new URLSearchParams(data).toString()
      console.log("query_str", str);
      console.log("md5_str", CryptoJS.MD5(str).toString());
    }

执行结果


前端加密后得到的MD5字符串为:36b00a7e6ad9dd23df98b50ae529b2d3

image.png

后端


代码


使用rawurlencode函数对字段值进行统一编码。

  $arr = [
    "name"      =>  "卢俊义",
    "age"       =>  25,
    "sex"       =>  "male",
    "remark"    =>  "dahsdahda~很~快的()哈肯 定='';:,.,。、??/<>-=-=()()好亏·-=啥多看哈 是道坎!@#¥%……&=*()——+=-·",
  ];
  foreach ($arr as $key => $val) {
    $arr[$key] = rawurlencode($val);
  }
  print_r($arr);
  $str = http_build_query($arr);
  echo $str.PHP_EOL;
  echo md5($str).PHP_EOL;

执行结果


image.png

可以看到两者执行结果一致,问题解决!

目录
相关文章
|
3月前
|
存储 缓存 安全
php项目源码加密之Zend Guard Loader加密的代码解密可能性很小-优雅草卓伊凡
php项目源码加密之Zend Guard Loader加密的代码解密可能性很小-优雅草卓伊凡
116 2
|
4月前
|
存储 安全 算法
用 MD5 加密 WordPress 验证码的完整教程
本文详细介绍了如何使用MD5加密技术增强WordPress验证码的安全性。通过将验证码答案以MD5形式加密并存储在Session中,避免了明文传输可能带来的安全风险。文章从形势分析、MD5算法介绍到实战操作步骤,逐步引导读者实现加密验证流程。同时提供了调试方法,确保修改生效。此教程旨在为网站添加一层安全保障,提升对抗网络攻击的能力。
240 1
|
7月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
303 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
5月前
|
存储 算法 安全
MD5加密
MD5(Message-Digest Algorithm 5)是一种单向加密算法,将任意长度的数据转换为128位固定长度的散列值,主要用于数据完整性校验和密码存储。其特点包括不可逆运算、高度离散性和相同输入生成一致结果。然而,MD5存在碰撞风险,直接加密密码不安全,需配合“加盐”处理增强安全性。文中提供了未加盐的MD5工具类`MD5Utils`,核心方法`msgToMD5`实现基本加密功能。尽管MD5理论上不可逆,但通过彩虹表等手段可能存在伪破解风险,建议结合多种加密算法提升安全性。
275 2
|
6月前
|
存储 JavaScript 前端开发
在NodeJS中使用npm包进行JS代码的混淆加密
总的来说,使用“javascript-obfuscator”包可以帮助我们在Node.js中轻松地混淆JavaScript代码。通过合理的配置,我们可以使混淆后的代码更难以理解,从而提高代码的保密性。
451 9
|
10月前
|
Linux PHP 数据安全/隐私保护
2024授权加密系统PHP网站源码
2024授权加密系统PHP网站源码
261 58
|
12月前
|
存储 Java 数据库
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
这篇文章介绍了如何在Java中通过加盐和加密算法(如MD5和SHA)安全地存储密码,并提供了一个密码工具类PasswordUtils和密码编码类PasswordEncoder的实现示例。
392 10
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
|
11月前
|
资源调度 前端开发 JavaScript
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第10天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤,包括安装依赖、创建混淆脚本、修改 `package.json` 脚本命令、构建项目并执行混淆,以及在 HTML 文件中引用混淆后的文件。通过这些步骤,可以有效提高代码的安全性。
1068 2
|
12月前
|
JavaScript Java PHP
快速对比:Django、Spring Boot、Node.js 和 PHP
快速对比:Django、Spring Boot、Node.js 和 PHP
544 7
|
12月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
258 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。