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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Gavin_new/article/details/53635551

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

一. 基础方法

为了简单易行,设计上,我将所有参数以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);
展开阅读全文

没有更多推荐了,返回首页