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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 解决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

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

目录
相关文章
|
4天前
|
Linux PHP 数据安全/隐私保护
2024授权加密系统PHP网站源码
2024授权加密系统PHP网站源码
84 58
|
3月前
|
数据安全/隐私保护 Python
Python中的MD5加密“解密”
Python中的MD5加密“解密”
67 0
|
1月前
|
资源调度 前端开发 JavaScript
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第10天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤,包括安装依赖、创建混淆脚本、修改 `package.json` 脚本命令、构建项目并执行混淆,以及在 HTML 文件中引用混淆后的文件。通过这些步骤,可以有效提高代码的安全性。
|
2月前
|
存储 Java 数据库
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
这篇文章介绍了如何在Java中通过加盐和加密算法(如MD5和SHA)安全地存储密码,并提供了一个密码工具类PasswordUtils和密码编码类PasswordEncoder的实现示例。
51 10
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
|
1月前
|
前端开发 JavaScript 安全
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第7天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤。包括项目准备、安装 `javascript-obfuscator`、配置 Vite 构建以应用混淆,以及最终构建项目进行混淆。通过这些步骤,可以有效提升前端代码的安全性,防止被他人轻易分析和盗用。
151 0
|
2月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
39 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
3月前
|
JavaScript 前端开发 安全
js逆向实战之烯牛数据请求参数加密和返回数据解密
【9月更文挑战第20天】在JavaScript逆向工程中,处理烯牛数据的请求参数加密和返回数据解密颇具挑战。本文详细分析了这一过程,包括网络请求监测、代码分析、加密算法推测及解密逻辑研究,并提供了实战步骤,如确定加密入口点、逆向分析算法及模拟加密解密过程。此外,还强调了法律合规性和安全性的重要性,帮助读者合法且安全地进行逆向工程。
108 11
|
3月前
|
前端开发 数据安全/隐私保护
JS-RSA超长加密
JS-RSA超长加密
65 4
|
2月前
|
数据安全/隐私保护 Python
Python中的MD5加密“解密”
Python中的MD5加密“解密”
108 0
|
2月前
|
IDE 开发工具 数据安全/隐私保护
Python编程实现批量md5加密pdf文件
Python编程实现批量md5加密pdf文件
42 0