制作接口时双方验证的token类

2014.11.21 制作接口时双方验证的token类已关闭评论

提供一个制作接口时双方验证的token类

 

<?php
/**
* Created by PhpStorm.
* User: huwenfeng@xywy.com
*
* Date: 14-11-20
* Time: 下午3:27
*/

class Api_Model_ToKenService
{

public function index(){
echo 'hello word';
}
/*
* 如果直接使用base64_encode和base64_decode方法的话,生成的字符串可能不适用URL地址。下面的方法可以解决该问题:
* @author sundongliang<sundongliang@xywy.com>
* @see http://www.thinkphp.cn/code/33.html
*/
function urlsafe_b64encode($string)
{
$data = base64_encode($string);
return str_replace(array('+', '/', '='), array('-', '_', ''), $data);
}

function urlsafe_b64decode($string)
{
$data = str_replace(array('-', '_'), array('+', '/'), $string);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr('====', $mod4);
}
return base64_decode($data);
}

/**
* 加密
* @param string $string 要加密或解密的字符串
* @param string $key 密钥,加密解密时保持一致
* @param int $expiry 有效时长,单位:秒
* @return string
*/
public function encrypt_code($string, $expiry = 0, $key = 'abc12345')
{

$ckey_length = 7;
$key = md5($key ? $key : UC_KEY); //加密解密时这个是不变的
$keya = md5(substr($key, 0, 16)); //加密解密时这个是不变的
$keyb = md5(substr($key, 16, 16)); //加密解密时这个是不变的
$keyc = $ckey_length ? substr(md5(microtime()), -$ckey_length) : '';
$cryptkey = $keya . md5($keya . $keyc); //64
$key_length = strlen($cryptkey); //64
$string = sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
for ($i = 0; $i <= 255; $i++) { //字母表 64位后重复 数列 范围为48~122
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
for ($j = $i = 0; $i < 256; $i++) { //这里是一个打乱算法
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
for ($a = $j = $i = 0; $i < $string_length; $i++) {
$result .= chr(ord($string[$i]) ^ ($box[$i]));
}

$str = $keyc . str_replace('=', '', $this->urlsafe_b64encode($result));

return $str;
}

/**
* 解密
* @param string $string 要加密或解密的字符串
* @param string $key 密钥,加密解密时保持一致
* @param int $expiry 有效时长,单位:秒
* @return string
*/
public function encrypt_decode($string, $expiry = 0, $key = 'abc12345')
{
$ckey_length = 7;
$key = md5($key ? $key : UC_KEY); //加密解密时这个是不变的
$keya = md5(substr($key, 0, 16)); //加密解密时这个是不变的
$keyb = md5(substr($key, 16, 16)); //加密解密时这个是不变的

$keyc = $ckey_length ? substr($string, 0, $ckey_length) : '';

$cryptkey = $keya . md5($keya . $keyc); //64
$key_length = strlen($cryptkey); //64
$string = $this->urlsafe_b64decode(substr($string, $ckey_length));
$string_length = strlen($string);
$result = '';
$box = range(0, 255);

$rndkey = array();
for ($i = 0; $i <= 255; $i++) { //字母表 64位后重复 数列 范围为48~122
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
for ($j = $i = 0; $i < 256; $i++) { //这里是一个打乱算法
$j = ($j + $box[$i] + $rndkey[$i]) % 256;

$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
for ($a = $j = $i = 0; $i < $string_length; $i++) {
$result .= chr(ord($string[$i]) ^ ($box[$i]));
}
if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
return substr($result, 26);
} else {
return false;
}
}
}

 

 

使用方法

 
echo $va = encrypt_code("3gWeb1" , 600) ;   //600秒有效时间 -此处会出现不同的值但是参数2时间内解密后的值是相同的

echo "<hr />" ;
//sleep(600) ;

echo encrypt_decode($va) ;  //超过encrypt_code参数2的时间返回空

 

 

评论已关闭。