用户登录之 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 信息加密 支付宝赞赏


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

查看所有标签

猜你喜欢:

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

The Linux Command Line

The Linux Command Line

William E. Shotts Jr. / No Starch Press, Incorporated / 2012-1-17 / USD 39.95

You've experienced the shiny, point-and-click surface of your Linux computer-now dive below and explore its depths with the power of the command line. The Linux Command Line takes you from your very ......一起来看看 《The Linux Command Line》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具