API安全

API安全

數(shù)據(jù)準(zhǔn)備

header:

time:時間戳

token:用戶登錄信息token jwt

version:版本

did:設(shè)備號

......

body:

name:gaozhan

......

客戶端加密

1.生成隨機AES加密字符串a(chǎn)es_key

2.aes_key對header內(nèi)容加密 aes_header

3.aes_key對body內(nèi)容加密 aes_body

4.rsa公鑰對aes_key進(jìn)行加密 rsa_aes_key

傳輸

0.rsa_aes_key放入header

1.aes_header放入header

2.aes_body 放body

服務(wù)端解密

0.RSA私鑰對rsa_aes_key解密 得到aes_key

1.aes_key對header解密

2.校驗時間戳?xí)r效性/版本有效性/用戶訪問權(quán)限

3.aes_key對aes_body解密

代碼示例

github: https://github.com/gaozhan3253/app-restful-api-demo

片段

laravel中間件:


     //獲取rsa_aes_key

     $rsa_aes_key=$request->header('rsa-aes-key');

      //不存在rsa加密字符串時

       if(empty($rsa_aes_key)) {

            return  response()->json(['message'=>'非法訪問','status_code'=>401],401);

       }

      //解密rsa加密字符串 得到aes加密字符串

             $aes_key= RsaOptions::decrypt($rsa_aes_key);

      if(empty($aes_key)) {

              return  response()->json(['message'=>'非法訪問','status_code'=>401],401);

       }

      //接收aes加密的header

          $aes_header=$request->header('aes-header');

       if(empty($aes_header)) {

           return  response()->json(['message'=>'無加密header信息','status_code'=>401],401);

       }

       //解密aes加密字符串

       $headers= AesOptions::aes128cbcDecrypt($aes_header,$aes_key);

       $headers=json_decode($headers);

       //驗證是否存在必須time字段 因為time字段絕對存在

        if(empty($headers) ||empty($headers->time)) {

              return   response()->json(['message'=>'無效header','status_code'=>401],401);

         }

     //驗證唯一性

       $onlyToken=$headers->onlytoken;

       //$onlyToken=$headers->onlytoken.rand(000001,999999);//測試用 唯一性處理

       $onlyTokenHasBool= Cache::store('redis')->has($onlyToken);

       if($onlyTokenHasBool) {

               return   response()->json(['message'=>'重復(fù)請求','status_code'=>401],401);

          }else{

               Cache::store('file')->put($onlyToken,'',5);

         }

        //驗證時效性

         $requestTime=$headers->time;//請求的時間戳

           $expiresTime=strtotime('-'. env('API_EXPIRES_TIME',1) .' minute');//請求有效時間

         if($expiresTime>$requestTime) {

                return    response()->json(['message'=>'請求已過期','status_code'=>401],401);

          }

       //將aes_key保存 用于將返回信息加密

       define('AES_KEY',$aes_key);

        //將解密后的header寫回header中

         if(count($headers)){

          foreach($headers   as  $key=>$value){

                //jwt驗證token格式化處理

                if($key=='token'){

                      $key='authorization';

                      $value='bearer '.$value;

                   }

             $request->headers->set($key,$value);

        }

       }

        //獲取body

         $aes_body=$request->get('aes-body','');

          //解密aes加密字符串

            $bodys= AesOptions::aes128cbcDecrypt($aes_body,$aes_key);

             $bodys=json_decode($bodys);

             if(count($bodys)){

              foreach($bodys  as   $key=>$value){

                     $request->offsetSet($key,$value);

               }

           }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,663評論 19 139
  • 由于REST API是系統(tǒng)暴露給外界的接口,所以安全性非常重要。安全不只是單純的加密和解密,而是一致性(integ...
    竹天亮閱讀 4,021評論 0 3
  • why JWT 現(xiàn)在,前后端分離和 RESTful API 越來越火熱,當(dāng)后臺漸漸開始只負(fù)責(zé)為客戶端提供 API ...
    jaychenIsUsed閱讀 5,234評論 1 8
  • 轉(zhuǎn)載鏈接:blog.nsfocus.net/rest-api-design-safety/ REST API 安全...
    javady閱讀 2,609評論 2 84
  • 兜兜轉(zhuǎn)轉(zhuǎn)數(shù)十載,有種媳婦熬成婆的快感! 不是故意將就,為她人做嫁衣不是我樂意而為的。是的,正如你所想,我沒有...
    若蘭雨非非閱讀 398評論 1 1

友情鏈接更多精彩內(nèi)容