本文为原创,禁止转载。
在设计到页面分享的活动中,需要对分享页面上的参数进行加密,以防止因为明文被人恶意攻击网站。于是,我用上了对称加密中比较简洁的异或加密。
一. 基础方法
为了简单易行,设计上,我将所有参数以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;
}
- 加密后的数据可能不是字符串,那就利用特殊方法将数据转为字符串
$data = bin2Str($data); //自定义数据转字符串方法
- base64编码后形成的字符串可能也不满足url编码,最后还要进行url编码
$data = urlencode($data);
二. 加密校验的改进加强
进行上述加密步骤后,的确能把信息进行加密并且在互联网上安全流通,但是很容易有个问题,如果密文上的某个字符被篡改,而不影响解析出来的json格式解析流程,并且刚好改变了其中动态变化的数据,这就尴尬了,这程序上是无法识别该数据的正确性的,因此还需要对加密前数据还要进行进一步处理。
如,在原数据的前面或者后面加上32位的CRC校验码:
function crcFixEnc($data){
//此处自由发挥
}
function crcFixDec($data){
//此处自由发挥
}
//加密前
crcFixEnc($jsondata);
//解密后校验
$jsondata = crcFixDec($data);