1.   本网站所有源码包解压密码:www.youhutong.com
会员登录  帮助问答

PHP字符串编码解码函数,字符串安全加密解密方法!(可用于用户自动登录安全实现加密方法)

小川 PHP

PHP字符串编码解码函数,字符串安全加密解密方法:

方法1:

/**
 * 字符串编码解码函数
 * @param: string $string 字符串
 * @param: string $operation 分ENCODE和DECODE两种方式
 * @param: string $key 算法密钥
 * @param: int $expiry 有效期(单位秒)
 * return: string
 */
function string_code($string, $operation = 'DECODE', $key = '', $expiry = 0) {

	if($operation == 'DECODE'){
		$string1 = substr($string, 0, floor(strlen($string)/3));
		$string2 = str_replace($string1, "", $string);
		$string = $string2.$string1;
		$string = str_replace(["-", "_"], ["/", "+"], $string);
	}
	
	$ckey_length = 4;
	$key = md5($key);
	$keya = md5(substr($key, 0, 16));
	$keyb = md5(substr($key, 16, 16));
	$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): 
	substr(md5(microtime()), -$ckey_length)) : '';

	$cryptkey = $keya.md5($keya.$keyc);
	$key_length = strlen($cryptkey);

	$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : 
	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++) {
		$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++) {
		$a = ($a + 1) % 256;
		$j = ($j + $box[$a]) % 256;
		$tmp = $box[$a];
		$box[$a] = $box[$j];
		$box[$j] = $tmp;
		$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
	}

	if($operation == 'DECODE') {
		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 ''; 
		}
	} else {
		$result = $keyc.str_replace('=', '', base64_encode($result));
		$result = str_replace(["/", "+"], ["-", "_"], $result);
		$result1 = substr($result, floor(strlen($result)/3)*(-1));
		$result2 = str_replace($result1, "", $result);
		$result = $result1.$result2;
		return $result;
	}
}




// 可以用来自动登录用户等等
//1 、加密数据,然后存入cookie
$code = string_code('5|小川编程', 'ENCODE', 'CtLgVd7f6r1xs', 2592000);
cookie(md5(config('cookie_key')), $code, 2592000);

//2、取出cookie值,然后解密。
$cookie = cookie(md5(config('cookie_key')));
$value = string_code($cookie, 'DECODE', 'CtLgVd7f6r1xs');
$value = explode('|', $value, 2);
if(count($value) != 2) $this->error('自动登录失败');
list($uid, $lastTime) = $value;
if(!empty($uid)){
	//有了用户ID,辅助值,我们就可以判断用户存在与否等等、	
}else{
     $this->error('自动登录失败');   
}

方法2:

/**
 * edauth高效可逆随机加密函数
 * @param string $string    明文 或 密文
 * @param $operation:true表示加密,false表示解密
 * @param $key: 密匙
 * @param $outtime:密文有效期, 单位为秒
 * @param $entype:加密方式 有md5和sha1两种 加密解密需要统一使用同一种方式才能正确还原明文
 * @return string 
 */
function edauth($string, $operation = true, $outtime = 0, $entype = 'md5') {
    $key = md5($key ? $key : C('AUTH_KEY'));
    $key_length = 4;
    if ($entype == 'md5') { //使用md5方式
        $long_len = 32;
        $half_len = 16;
        $entype == 'md5';
    } else { //使用sha1方式
        $long_len = 40;
        $half_len = 20;
        $entype == 'sha1';
    }

    $key      = $key != '' ? $key : substr(md5($_SERVER['DOCUMENT_ROOT'] 
                . C('AUTH_KEY') . $_SERVER['REMOTE_ADDR']), 0, 30);

    $fixedKey = hash($entype, $key);

    $egiskeys = md5(substr($fixedKey, $half_len, $half_len));

    $runtoKey = $key_length ? ($operation ? 
                substr(hash($entype, microtime(true)), -$key_length) :
                substr($string, 0, $key_length)) : '';

    $keys     = hash($entype, substr($runtoKey, 0, $half_len) . substr($fixedKey, 0, $half_len) 
               . substr($runtoKey, $half_len) . substr($fixedKey, $half_len));

    $string   = $operation ? sprintf('%010d', $outtime ? $outtime + time() : 0) 
               . substr(md5($string . $egiskeys), 0, $half_len) 
               . $string : base64_decode(substr($string, $key_length));

    $i = 0;

    $result   = '';

    $string_length = strlen($string);

    for ($i = 0; $i < $string_length; $i++) {

        $result .= chr(ord($string{$i}) ^ ord($keys{$i % $long_len}));

    }

    if ($operation) {

        return $runtoKey . str_replace('=', '', base64_encode($result));

    } else {
        
        if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && 
            substr($result, 10, $half_len) == substr(md5(substr($result, $half_len + 10) 
                . $egiskeys), 0, $half_len)) {


            return substr($result, $half_len + 10);

        } else {

            return '';

        }
    }
}


如果你觉得这篇教程的内容对你有帮助、请支持本站谢谢!  点击进入捐赠通道

转载请注明来源地址:小川编程 » https://www.youhutong.com/index.php/article/index/110.html

( 0 )个小伙伴在吐槽
    登录帐号  如果已经登录请刷新! 发表我的评论
    表情