URL参数对称加密---PHP语言版本

来源:互联网 发布:软件页面设计规范 编辑:程序博客网 时间:2024/06/03 05:18

本文为原创,禁止转载。
在设计到页面分享的活动中,需要对分享页面上的参数进行加密,以防止因为明文被人恶意攻击网站。于是,我用上了对称加密中比较简洁的异或加密。

一. 基础方法

为了简单易行,设计上,我将所有参数以json对象封装起来,然后再进行加密:
1. json封装对象

 $data = json_encode($data);

2.异或对称加密(两种方法,自行选择)

/** * 方法1 * 直接异或对称加密*/function xor_enc($str,$key){        $crytxt = '';        $keylen = strlen($key);        for($i=0;$i<strlen($str);$i++)        {         $k = $i%$keylen;         $crytxt .= $str[$i] ^ $key[$k];        }        return $crytxt; }
/** * 方法2(使用该函数要求秘钥数据不能具有周期性【如:123123就是不行的】,否则加密可能无效) * 异或对称加密 * 利用a^b^c = a^(b^c)  * 若数据比秘钥短,则秘钥超出部分会以数据长度为周期循环运算加密 * 若数据比秘钥长,则秘钥周期延长运算加密数据 * 最终原始数据和加密数据长度一样长 */function xor_enc($data,$key){    $crytxt = '';    $dataLen = strlen($data);    $keyLen = strlen($key);    $cryCnt = ceil($keyLen/$dataLen);    for($x=0; $x<$cryCnt;$x++){        $keySec = substr($key, $dataLen*$x,$dataLen);        $keySecLen = strlen($keySec);        for($i=0;($x==0&&$i<$dataLen)||($x>0&&$i<$keySecLen);$i++){            $k = $i%$keySecLen;            if($x==0){                $crytxt .= $data[$i] ^ $keySec[$k];            }else{                $crytxt[$i] = $crytxt[$i] ^ $keySec[$k];            }        }    }    return $crytxt;}
  1. 加密后的数据可能不是字符串,那就利用特殊方法将数据转为字符串
$data = bin2Str($data); //自定义数据转字符串方法
  1. base64编码后形成的字符串可能也不满足url编码,最后还要进行url编码
$data = urlencode($data);

二. 加密校验的改进加强

进行上述加密步骤后,的确能把信息进行加密并且在互联网上安全流通,但是很容易有个问题,如果密文上的某个字符被篡改,而不影响解析出来的json格式解析流程,并且刚好改变了其中动态变化的数据,这就尴尬了,这程序上是无法识别该数据的正确性的,因此还需要对加密前数据还要进行进一步处理。

如,在原数据的前面或者后面加上32位的CRC校验码:

function crcFixEnc($data){    //此处自由发挥}function crcFixDec($data){    //此处自由发挥}//加密前crcFixEnc($jsondata);//解密后校验$jsondata = crcFixDec($data);
0 0
原创粉丝点击