用户登录之 Cookie 信息加密

栏目: 编程工具 · 发布时间: 6年前

内容简介:程序员都知道的、用户登陆后,用户信息一般会选择保存在 Cookie 当中,因为 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,谢谢大家的阅读!祝每天开心~

版权声明:本文为博主半原创文章,未经博主允许不得转载。

赞赏

用户登录之 Cookie 信息加密 微信赞赏 用户登录之 Cookie 信息加密 支付宝赞赏


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Practical Algorithms for Programmers

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》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

html转js在线工具
html转js在线工具

html转js在线工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具