1. 程式人生 > >php---進行簽名驗證

php---進行簽名驗證

服務端 pub appid 什麽 通過 div 數據請求 each toupper

為什麽要進行簽名,我們在進行數據請求的時候,為了防止數據被人截取,造成不好的影響,所以我們在進行數據請求的時候,需要進行簽名驗證,進行簽名的原理是:客戶端和服務端使用同樣的簽名算法,來計算簽名,當客戶端提交的簽名,和服務端提供的簽名一致的時候,就簽名成功。

這裏是仿照微信驗證的簽名算法:需要用到 appid 和 appSecret。

具體實現:

/* 簽名算法 */
public function sign(){
    $appid = "dd9818820b95ec8e3d";
    $appSecret = "e5178f68c37c3a24772e463deb8cc4d8";
    $postData
= array( ‘appid‘=>$appid, ‘timestamp‘=>‘1544883104‘, ‘nonce‘=>md5(md5(‘dd9818820b95ec8e3d‘).‘1544883104‘), ‘sign‘=>‘B016B5D43749E26775B260FBED08DDCA‘ ); echo $this->getSignature()."<br>"; echo $this->checkSignature($postData)."<br>";
die; } public function checkSignature($data = null){ $appid = "dd9818820b95ec8e3d"; $appSecret = "e5178f68c37c3a24772e463deb8cc4d8"; if(!$data){return false;}; $clientSign = $data[‘sign‘]; $array = array(); $array[‘appid‘] = $data[‘appid‘]; $array[‘timestamp‘] = $data[‘timestamp‘];
$array[‘nonce‘] = $data[‘nonce‘]; ksort($array); $str = ""; foreach ($array as $k => $v) { $str.= $k.$v; } $restr = $str.$appSecret; $reserverSign = strtoupper(md5($restr)); if($clientSign == $reserverSign){ return true; }; return false; } public function getSignature($array = array()){ $appid = "dd9818820b95ec8e3d"; $appSecret = "e5178f68c37c3a24772e463deb8cc4d8"; $array = array( ‘appid‘=>$appid, ‘timestamp‘=>‘1544883104‘, ‘nonce‘=>md5(md5(‘dd9818820b95ec8e3d‘).‘1544883104‘), ); // 1.對加密數組進行字典排序 防止因為參數順序不一致而導致下面拼接加密不同 ksort($array); // 2.將key和value進行拼接 $str = ""; foreach ($array as $k => $v) { $str.= $k.$v; } // 3.通過sha1(或md5)加密並轉化為大寫 $restr = $str.$appSecret; $sign = strtoupper(md5($restr)); return $sign; } public function getAppid($phone = "18314416390"){ return ‘dd‘.substr(md5(md5(time()).md5($phone).mt_rand(1,1000000)),0,16); } public function getAppSecret($phone = "18314416390"){ $key = ‘|Hx@IP9O]>6KFX\Z2(r[/?st1}^CNh+W4oQeDgS‘; return md5(md5($key).md5($phone).md5(time()).mt_rand(1,1000000)); }

php---進行簽名驗證