PHP字符串编码解码函数,字符串安全加密解密方法:
/**
* 字符串编码解码函数
* @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('自动登录失败');
}/**
* 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
1、本站发布的内容仅限用于学习和研究目的.请勿用于商业或非法用途,下载后请24小时内删除。
2、本站所有内容均不能保证其完整性,不能接受请勿购买或下载,如需完整程序,请去其官方购买正版使用
3、本站联系方式Email:admin@youhutong.com ,收到邮件会第一时间处理。
4、如侵犯到任何版权问题,请立即告知本站(立即在线告知),本站将及时删除并致以最深的歉意
