1. 程式人生 > >tp5使用cookie加密演算法,以登入為例

tp5使用cookie加密演算法,以登入為例

首先,我們為什麼要對cookie加密?

之所以要對cookie加密是以為cookie是儲存在客戶端的,稍微懂一點技術的人都能找到cookie的儲存位置,如果我們儲存cookie的時候沒有加密,而是明文儲存的話也就是說我們的使用者名稱和密碼就完全暴露了,這是一個非常大的安全隱患,所以必須加密cookie。

其次,我們不管要對cookie加密,還要考慮到當我們使用的時候要對加密後的cookie進行解密處理,得到正確的使用者名稱和密碼後才能做自動登入一類的功能,下面看看我們的加密方案:

1:在配置檔案config中新增

'encryption_key'         =>'d441d33a65d31dbf0a8016a85c71a5b3',

2:在common檔案中新增

//type  0:加密  1:解密
function encryption($value,$type=0){
   $key=config('encryption_key');
   if($type == 0){//加密
      return str_replace('=', '', base64_encode($value ^ $key));
   }else{
      $value=base64_decode($value);
      return $value ^ $key;
   }
}

 3:在模型中加密程式碼

 public function login($data,$type=0){
        $userData=array();
        $userData['username']=trim($data['username']);
        $userData['password']=md5($data['password']);
        //驗證使用者名稱或郵箱或手機號是否存在
        $users=db('user')->where(array('username'=>$userData['username']))->whereOr(array('email'=>$userData['username']))->whereOr(array('mobile_phone'=>$userData['username']))->find();
        // dump($users); die;
        if($users){
            if($users['password'] == $userData['password']){
                session('uid',$users['id']);
                session('username',$users['username']);
                //寫入會員等級及折扣率
                $points=$users['points'];
                $memberLevel=db('member_level')->where('bom_point','<=',$points)->where('top_point','>=',$points)->find();
                session('level_id',$memberLevel['id']);//等級id
                session('level_rate',$memberLevel['rate']);//等級折扣率
                //寫入cookie
                if(isset($data['remember'])){
                    $aMonth=30*24*60*60;
                    $username=encryption($users['username'],0);
                    $password=encryption($data['password'],0);
                    cookie('username', $username, $aMonth, '/');
                    cookie('password', $password, $aMonth, '/');
                }
                $arr=[
                    'error'=>0,
                    'message'=>"",
                ];
                if($type == 1){
                    return $arr;
                }else{
                    return json($arr);
                }
            }else{
               $arr=[
                'error'=>1,
                'message'=>"<i class='iconfont icon-minus-sign'></i>使用者名稱或者密碼錯誤",
                'url'=>'',
                ];
                if($type == 1){
                    return $arr;
                }else{
                    return json($arr);
                }
            }
        }else{
            $arr=[
            'error'=>1,
            'message'=>"<i class='iconfont icon-minus-sign'></i>使用者名稱或者密碼錯誤",
            'url'=>'',
            ];
            if($type == 1){
                return $arr;
            }else{
                return json($arr);
            }
        }
    }

4:在控制器中解密程式碼

 public function checkLogin(){
        $uid=session('uid');
        if($uid){
            $arr['error']=0;
            $arr['uid']=$uid;
            $arr['username']=session('username');
            return json($arr);
        }else{
            if(cookie('username') && cookie('password')){
                $data['username']=encryption(cookie('username'),1);
                $data['password']=encryption(cookie('password'),1);
                $loginRes=model('user')->login($data,1);
                if($loginRes['error'] == 0){
                    $arr['error']=0;
                    $arr['uid']=$uid;
                    $arr['username']=session('username');
                    return json($arr);
                }
            }
            $arr=array();
            $arr['error']=1;
            return json($arr);
        }
    }