国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

AES加解密在php接口請求過程中的應用示例

2024-05-04 23:51:29
字體:
來源:轉載
供稿:網友

在php請求接口的時候,我們經常需要考慮的一個問題就是數據的安全性,因為數據傳輸過程中很有可能會被用fillder這樣的抓包工具進行截獲。一種比較好的解決方案就是在客戶端請求發起之前先對要請求的數據進行加密,服務端api接收到請求數據后再對數據進行解密處理,返回結果給客戶端的時候也對要返回的數據進行加密,客戶端接收到返回數據的時候再解密。因此整個api請求過程中數據的安全性有了一定程度的提高。

今天結合一個簡單的demo給大家分享一下AES加解密技術在php接口請求中的應用。

首先,準備一個AES加解密的基礎類:

<?php/** * 加密基礎類 */class Crypt_AES{  protected $_cipher = "rijndael-128";  protected $_mode = "cbc";  protected $_key;  protected $_iv = null;  protected $_descriptor = null;  /**   * 是否按照PKCS #7 的標準進行填充   * 為否默認將填充“/0”補位   * @var boolean   */  protected $_PKCS7 = false;  /**   * 構造函數,對于密鑰key應區分2進制字符串和16進制的。   * 如需兼容PKCS#7標準,應選項設置開啟PKCS7,默認關閉   * @param string $key    * @param mixed $iv   向量值   * @param array $options   */  public function __construct($key = null, $iv = null, $options = null)  {    if (null !== $key) {      $this->setKey($key);    }    if (null !== $iv) {      $this->setIv($iv);    }    if (null !== $options) {      if (isset($options['chipher'])) {        $this->setCipher($options['chipher']);      }      if (isset($options['PKCS7'])) {        $this->isPKCS7Padding($options['PKCS7']);      }      if (isset($options['mode'])) {        $this->setMode($options['mode']);      }    }  }  /**   * PKCS#7狀態查看,傳入Boolean值進行設置   * @param boolean $flag   * @return boolean   */  public function isPKCS7Padding($flag = null)  {    if (null === $flag) {      return $this->_PKCS7;    }    $this->_PKCS7 = (bool) $flag;  }  /**   * 開啟加密算法   * @param string $algorithm_directory locate the encryption    * @param string $mode_directory   * @return Crypt_AES   */  public function _openMode($algorithm_directory = "" , $mode_directory = "")   {    $this->_descriptor = mcrypt_module_open($this->_cipher,                         $algorithm_directory,                         $this->_mode,                        $mode_directory);    return $this;  }  public function getDescriptor()  {    if (null === $this->_descriptor) {      $this->_openMode();    }    return $this->_descriptor;  }  protected function _genericInit()  {    return mcrypt_generic_init($this->getDescriptor(), $this->getKey(), $this->getIv());  }  protected function _genericDeinit()  {    return mcrypt_generic_deinit($this->getDescriptor());  }  public function getMode()  {    return $this->_mode;  }    public function setMode($mode)  {    $this->_mode = $mode;    return $this;  }  public function getCipher()  {    return $this->_cipher;  }    public function setCipher($cipher)  {    $this->_cipher = $cipher;    return $this;  }    /**   * 獲得key   * @return string   */  public function getKey()  {    return $this->_key;  }    /**   * 設置可以   * @param string $key   */  public function setKey($key)  {    $this->_key = $key;    return $this;  }    /**   * 獲得加密向量塊,如果其為null時將追加當前Descriptor的IV大小長度   *   * @return string   */  public function getIv()  {    if (null === $this->_iv && in_array($this->_mode, array( "cbc", "cfb", "ofb", ))) {      $size = mcrypt_enc_get_iv_size($this->getDescriptor());      $this->_iv = str_pad("", 16, "/0");    }    return $this->_iv;  }  /**   * 獲得向量塊   *   * @param string $iv   * @return Crypt_AES $this   */  public function setIv($iv)  {    $this->_iv = $iv;    return $this;  }    /**   * 加密   * @param string $str 被加密文本   * @return string   */  public function encrypt($str){    $td = $this->getDescriptor();    $this->_genericInit();    $bin = mcrypt_generic($td, $this->padding($str));    $this->_genericDeinit();    return $bin;  }   public function padding($dat)  {    if ($this->isPKCS7Padding()) {      $block = mcrypt_enc_get_block_size($this->getDescriptor());         $len = strlen($dat);      $padding = $block - ($len % $block);      $dat .= str_repeat(chr($padding),$padding);          }    return $dat;  }  public function unpadding($str)  {    if ($this->isPKCS7Padding()) {      $pad = ord($str[($len = strlen($str)) - 1]);      $str = substr($str, 0, strlen($str) - $pad);    }    return $str;  }  /**   * 解密   * @param string $str    * @return string   */  public function decrypt($str){    $td = $this->getDescriptor();    $this->_genericInit();    $text = mdecrypt_generic($td, $str);    $this->_genericDeinit();    return $this->unpadding($text);  }    /**   * 16進制轉成2進制數據   * @param string $hexdata 16進制字符串   * @return string   */  public static function hex2bin($hexdata)   {    return pack("H*" , $hexdata);  }  /**   * 字符串轉十六進制   * @param string $hexdata 16進制字符串   * @return string   */  public static function strToHex($string)  {    $hex='';    for($i=0;$i<strlen($string);$i++)      $hex.=dechex(ord($string[$i]));    $hex=strtoupper($hex);    return $hex;  }  /**   * 十六進制轉字符串   * @param string $hexdata 16進制字符串   * @return string   */  function hexToStr($hex)  {    $string='';    for($i=0;$i<strlen($hex)-1;$i+=2)      $string.=chr(hexdec($hex[$i].$hex[$i+1]));    return $string;  }}

客戶端請求部分:

<?php include 'AES.php';$md5Key = 'ThisIsAMd5Key';               // 對應服務端:$md5key = 'ThisIsAMd5Key';$aesKey = Crypt_AES::strToHex('1qa2ws4rf3edzxcv');   // 對應服務端:$aesKey = '3171613277733472663365647A786376';$aesKey = Crypt_AES::hex2bin($aesKey);$aesIV = Crypt_AES::strToHex('dfg452ws');       // 對應服務端:$aesIV = '6466673435327773';$aes = new Crypt_AES($aesKey,$aesIV,array('PKCS7'=>true, 'mode'=>'cbc'));// var_dump($aes);$data['name'] = 'idoubi';$data['sex']= 'male';$data['age'] = 23;$data['signature'] = '白天我是一個程序員,晚上我就是一個有夢想的演員。';$content = base64_encode($aes->encrypt(json_encode($data)));$content = urlencode($content);$sign = md5($content.$md5Key);$url = 'http://localhost/aesdemo/api.php';$params = "version=1.0&sign=$sign&content=$content";// 請求接口post($url, $params);/** * 接口請求函數 */function post($url, $params) {  $curlPost= $params;  $ch = curl_init();   //初始化curl  curl_setopt($ch, CURLOPT_URL, $url);  //提交到指定網頁  curl_setopt($ch, CURLOPT_HEADER, 0);  //設置header  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  //要求結果為字符串且輸出到屏幕上  curl_setopt($ch, CURLOPT_POST, 1);  //post提交方式  curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);  $result = curl_exec($ch);//運行curl  curl_close($ch);  var_dump(json_decode($result, true));}

接口處理邏輯:

<?php include 'AES.php';$data = $_POST; // 接口請求得到的數據$content = $data['content'];$sign = $data['sign'];$aesKey = '3171613277733472663365647A786376';$aesIV = '6466673435327773';$md5key = 'ThisIsAMd5Key';// 校驗數據if(strcasecmp(md5(urlencode($content).$md5key),$sign) == 0) {  // 數據校驗成功  $key = Crypt_AES::hex2bin($aesKey);  $aes = new Crypt_AES($key, $aesIV, array('PKCS7'=>true, 'mode'=>'cbc'));  $decrypt = $aes->decrypt(base64_decode($content));  if (!$decrypt) {   // 解密失敗    echo json_encode('can not decrypt the data');  } else {    echo json_encode($decrypt);   // 解密成功  }} else{  echo json_encode('data is not integrity');    // 數據校驗失敗}

上述接口請求過程中定義了三個加解密需要用到的參數:$aesKey、$aesIV、$md5key,在實際應用過程中,只要與客戶端用戶約定好這三個參數,客戶端程序員利用這幾個參數對要請求的數據進行加密后再請求接口,服務端程序員在接收到數據后利用同樣的加解密參數對數據進行解密,整個api請求過程中的數據就很安全了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 恩平市| 泾阳县| 青海省| 任丘市| 洪洞县| 同德县| 昌邑市| 清水河县| 隆林| 蒙山县| 东乡县| 增城市| 元氏县| 卓资县| 克什克腾旗| 平南县| 双桥区| 扶风县| 兴仁县| 雅安市| 长岛县| 汾阳市| 富民县| 疏勒县| 获嘉县| 特克斯县| 江津市| 通道| 徐水县| 远安县| 台南县| 吉首市| 额敏县| 九龙县| 叙永县| 黄骅市| 象山县| 麻江县| 彝良县| 紫阳县| 山西省|