PHP加密与JavaScript解密示例代码及安全性说明

Miles
Miles
发布时间:2026-10-14| 6人浏览过
原创

本文将介绍如何在后端使用PHP对数据进行编码加密,并在前端通过JavaScript进行解码显示。虽然这种前后端分离加解密的方式在特定场景下有用,但必须明确其本质是“混淆”而非真正的“加密”,因为密钥不可避免地会暴露在客户端。

方法一:基于Base64与MD5的异或混淆

该方案首先将明文进行Base64编码,然后结合一个固定的密钥(此处以"123456"为例,实际使用中建议修改),通过MD5算法生成固定长度的密钥串。随后遍历每个字符,将其ASCII值与密钥对应位置的字符ASCII值进行按位异或(XOR)操作,最后再次进行Base64编码输出。

第1步:PHP端加密函数实现

此步骤的目的生成一段经过混淆处理后的字符串。入口为自定义函数 strencode,输入原始字符串。
核心逻辑如下:
1. 调用 base64_encode 对输入字符串进行初步编码。
2. 计算密钥:$key = md5('123456');。
3. 遍历编码后的字符串,将每个字符与密钥循环匹配的字符进行异或运算。
4. 将结果再次 base64_encode 返回。

<?php
function strencode($string) {
   $string = base64_encode($string);
   $key = md5('123456');
   $len = strlen($key);
   $code = '';
   for($i = 0; $i < strlen($string); $i++) {
     $k = $i % $len;
     $code .= $string[$i] ^ $key[$k];
   }
   return base64_encode($code);
}
// 测试示例
echo strencode('abced你好我是你们定的点点滴滴asd@#$)()*&*&*');
?>

第2步:JavaScript端解密函数实现

为了在前端还原数据,需要实现对应的解密逻辑。由于浏览器原生不支持所有高级加密库,这里需要依赖一个简单的Base64解码工具或内置库。假设存在 calcMD5 和 Base64.decode 辅助方法(如CryptoJS库提供的功能)。

操作步骤如下:
1. 对接收到的密文进行Base64解码。
2. 使用相同的密钥 "123456" 计算出 key。
3. 遍历解码后的字符串,利用 String.fromCharCode 和异或运算恢复原始字符。
4. 将恢复出的字节序列再次视为Base64进行解码,得到最终明文。

<script>
// 注意:实际使用时需引入支持MD5和Base64解码的库,如CryptoJS
function strdecode(string) {
   // 假设 calcMD5 和 Base64.decode 已定义
   let key = calcMD5('123456');
   let decodedStr = Base64.decode(string);
   let len = key.length;
   let code = '';
   for (let i = 0; i < decodedStr.length; i++) {
     let k = i % len;
     code += String.fromCharCode(decodedStr.charCodeAt(i) ^ key.charCodeAt(k));
  }
   return Base64.decode(code);
}
// 测试用例(需确保密文是由PHP函数生成的对应密文)
// alert(strdecode('PGZ6Cz40Z1JCWCYNRVtSDwsvfVsIexpcEFN0DU0OSQkXQUIPCQxnV1NLDA9SSw8PF1JhWxAHZ18FAGIncUFiFS5yWxAuClxUf15fXA=='));
</script>

方法二:简单字符异或混淆

如果不需要Base64编码,仅希望对可见文本进行简单的反转义或混淆,可以使用更直接的异或方案。这种方法常用于对HTML实体或普通文本进行轻量级隐藏。

第1步:PHP端处理

遍历字符串中的每个字符,如果其ASCII码小于128,则与整数7进行异或运算。非ASCII字符(如中文)通常不受影响或保持原样。此方法常用于对JS脚本内容进行编码,以防止被直接读取。

<?php
if(!function_exists('jm')){
   function jm($str){
     $len = strlen($str);
     for($i=0;$i<$len;$i++)
     {
       $ascc=ord($str[$i]);
       if($ascc<128)
       {
         $ascc=$ascc^7;
       }
       $res.=chr($ascc);
     }
     return $res;
  }
}
// 示例:对一段包含alert的JS代码进行编码
$encoded_js = addslashes(jm("<script>alert('测试咯~~~');</script>"));
// 将编码后的内容嵌入到新的JS调用中
echo "<SCRIPT LANGUAGE='JavaScript'>xcount('$encoded_js');</SCRIPT>";
?>

第2步:JavaScript端还原

前端接收到编码后的字符串后,同样需要进行异或逆运算(异或的逆运算是自身,即 A XOR B XOR B = A)。因此,JS代码中也需要定义一个对小于128的字符异或7的逻辑,然后动态写入页面。

<script>
xflag=true;
function xcount(xh){
 if(!xflag) return;
 var xc="",xd=new Array(),xe="",xf=0;
 for(i=0;i<xh.length;i++){
  xa=xh.charCodeAt(i);
  if(xa<128)xa=xa^7; // 关键:再次异或7以恢复原文
  xe+=String.fromCharCode(xa);
  if(xe.length>80){
   xd[xf++]=xe;xe="";
   }
 }
 xc=xd.join("")+xe;
 document.write(xc);
}
</script>

安全性评估与注意事项

尽管上述代码展示了加密与解密的过程,但必须清醒地认识到:

  • 密钥泄露:在第二种方法中,密钥(数字7)和部分逻辑直接写在JavaScript代码里;在第一种方法中,MD5计算的种子 "123456" 也存在于前端或可通过网络请求获取。任何具备基本编程知识的用户都可以打开浏览器开发者工具查看源代码,从而获取解密密钥和方法。
  • 适用场景:这类技术适合用于防止“小白”用户直接复制粘贴内容,或者防止搜索引擎轻易抓取某些非敏感的结构化数据。它绝对不适用于传输密码、支付令牌、个人敏感信息等高安全要求的数据。
  • 更好的替代方案:如果需要真正的安全传输,应始终使用HTTPS协议,并对敏感数据在服务端进行高强度加密(如AES),仅在必要的最小范围内传输解密后的数据,严禁将解密密钥存放在客户端代码中。

以上就是PHP加密与JavaScript解密实现原理及示例的详细内容,更多关于前端数据安全与代码混淆的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。