PHP加密与JavaScript解密示例代码及安全性说明
本文将介绍如何在后端使用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解密实现原理及示例的详细内容,更多关于前端数据安全与代码混淆的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













