内容简介:程序员都知道的、用户登陆后,用户信息一般会选择保存在 Cookie 当中,因为 Cookie 是保存在客户端,并且 Cookie 可以在客户端用浏览器自由更改,这样将会造成用户 Cookie 存在伪造的危险,从而可能使伪造 Cookie 者登录任意用户的账户。这里介绍一种加密 Cookie 信息安全的函数。因个人项目使用中,需要请私聊。友好提醒:互联网原版本中此函数有些许代码问题,检查后使用。
一、引言
程序员都知道的、用户登陆后,用户信息一般会选择保存在 Cookie 当中,因为 Cookie 是保存在客户端,并且 Cookie 可以在客户端用浏览器自由更改,这样将会造成用户 Cookie 存在伪造的危险,从而可能使伪造 Cookie 者登录任意用户的账户。这里介绍一种加密 Cookie 信息安全的函数。
二、加密函数
//信息加密
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0)
{
// 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
$ckey_length = 4;
// 密匙
$key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
// 密匙a会参与加解密
$keya = md5(substr($key, 0, 16));
// 密匙b会用来做数据完整性验证
$keyb = md5(substr($key, 16, 16));
// 密匙c用于变化生成的密文
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) :
substr(md5(microtime()), -$ckey_length)) : '';
// 参与运算的密匙
$cryptkey = $keya . md5($keya . $keyc);
$key_length = strlen($cryptkey);
// 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),
//解密时会通过这个密匙验证数据完整性
// 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
$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 {
// 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
// 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
return $keyc . str_replace('=', '', base64_encode($result));
}
}
三、加密
$userInfo = ['uid' => $uid, 'username' => $username];
$user = base64_encode(serialize($userInfo));
$user = authcode($user, 'ENCODE', C('WEBSITE_DOMAIN'), 0); //加密
四、解密
因个人项目使用中,需要请私聊。
友好提醒:互联网原版本中此函数有些许代码问题,检查后使用。
Finally,谢谢大家的阅读!祝每天开心~
版权声明:本文为博主半原创文章,未经博主允许不得转载。
赞赏
微信赞赏
支付宝赞赏
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 破解网站登录加密–RSA
- 【Python3爬虫】破解时光网登录加密参数并实现模拟登录
- beego实现用户未登录跳转到登录页面
- Django实现小程序的登录验证功能,并维护登录态
- 加密原理详解:对称式加密 VS 非对称式加密
- iTerm2结合 expect 脚本实现 ssh 登录跳板机后登录指定服务器
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Practical Algorithms for Programmers
Andrew Binstock、John Rex / Addison-Wesley Professional / 1995-06-29 / USD 39.99
Most algorithm books today are either academic textbooks or rehashes of the same tired set of algorithms. Practical Algorithms for Programmers is the first book to give complete code implementations o......一起来看看 《Practical Algorithms for Programmers》 这本书的介绍吧!