一、概述
開年第一篇,該篇主要講述了介面開發中,如何安全認證、如何用php簽名認證。
二、說說歷史
簽名認證是什麼?為什麼要做簽名認證?簽名認證**會用到?no、no、no…是不是,是不是,一下子疑問就這麼多了!沒事兒,通過追溯歷史,我們來明白這些。
1、簽名認證是什麼?
數字簽名是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術實現,用於鑑別數字資訊的方法。一套數字簽名通常定義兩種互補的運算,乙個用於簽名,另乙個用於驗證。
數字簽名,就是只有資訊的傳送者才能產生的別人無法偽造的一段數字串,這段數字串同時也是對資訊的傳送者傳送資訊真實性的乙個有效證明。
在這個以「資料為生命」的時代,每乙個開發商都盡可能的收集客戶的資料建立自己的bi庫,各系統、各平台間資料的傳輸和呼叫變得非常普遍且非常重要;那麼作為開發人員,我們不但要防止系統被攻擊被入侵,我們還要確保資料的安全和完整
2、為什麼要做簽名認證?
在使用http或者soap傳輸資料的時候,簽名作為其中乙個引數,可以起到關鍵作用:1、鑑權(通過客戶的金鑰,服務端的金鑰匹配);2、資料防篡改(引數是明文傳輸,將引數及金鑰加密作為簽名與伺服器匹配);下面來分析下具體的方式:
將請求引數中的各個鍵值對按照key的字串順序公升序排列(大小寫敏感),把key和value拼成一串之後最後加上金鑰,組成key1value1key2value2privatekey的格式,轉成utf-8編碼的位元組序列後計算md5,作為請求的簽名。計算出來的簽名串應當全為小寫形式。如果某個引數的值為空,則此引數不參與簽名。
3、簽名認證**會用到?
最常見的使我們在開發介面的時候,為了不被非法訪問,往往我們會做簽名認證,比如支付介面…
以我這次寫的為例子來描述一下整個流程:
使用者參照我們提供的介面文件,請求我們的介面,使用者按照我們介面說明的簽名演算法生成簽名串作為引數,然後帶上必要的引數(get、post),如果服務端驗證成功,則返回真實資料。
在服務端:我們首要驗證提交引數的個數、格式是否正確,然後我們通過提交的引數用簽名演算法生成乙個簽名串,最後服務端生成的簽名串和客戶端提交過來的簽名串進行比較,成功返回真實資料。
四、上**
<?php
namespace ceshi;
/** * 簽名認證演算法
* hmac-sha256加密方式
* 隨機函式可換更好的方法-本例項隨機函式比較簡單,隨機性不夠
* apisign類作為服務端,類以外的**作為客戶端示例**
* author jiechengyang
*/class apisign
if (!isset($this->_config['_time']) || $this->getistimeout())
// 客戶端驗證
$requestsignature = $this->_config['_sign'];
$requestsignature = str_replace(' ', '+', $requestsignature);
}$signature = $this->generatesign($this->_config);
if ($requestsignature != $signature)
$accesstoken = $this->getaccesstoken();
// 使用者登入token驗證
if ($this->logincheck && $accesstoken != $this->_config['access_token'])
return true;
}private function callback($json=, $status='ok')
private function getistimeout()
return false;
}/**
* 生成隨便數
*/public function generaterangenum($length = 32, $istolower = false)
return $str;
}private function generaterandomstring($length = 10)
return $randomstring;
}protected function generatesign($params)
if($this->logincheck && isset($params['access_token']))
ksort($params);
$str = '';
foreach ($params as $key => $value)
$str = rtrim($str, '&');
}public function getaccesstoken()
$accesstoken = json_decode(file_get_contents(self::access_tocen_path), true);
if (time() - $accesstoken['time'] > $accesstoken['expires_in'] - self::delay_time)
return $accesstoken['value'];
}}/**
* 生成隨便數
*/function generaterangenum($length = 32, $istolower = false)
return $str;
}function generaterandomstring($length = 10)
return $randomstring;
} ksort($params);
$str = '';
foreach ($params as $key => $value)
$str = rtrim($str, '&');
}header("content-type:text/html;charset:utf-8");
$algo = 'sha256';
$nonce = generaterangenum(32);
$nonce = 'kj4esp2qcngaj3eajpnrhcqr9g4ykntm';//---用於公司專案測試
$logincheck = false;
$params = [
'_time' => time(),
'_nonce' => $nonce,
];echo $params['_time'],'';//---用於公司專案測試
echo $sign;exit;//---用於公司專案測試
$params['_sign'] = $sign;
$logincheck && $params['access_token'] = generaterangenum(16);
// echo '';print_r($params);
$apisignmodel = new apisign($params, $logincheck);
摘要認證和簽名認證簡述
整理下演算法的使用場景。為什麼需要認證 應對場景 摘要認證原理 摘要認證實現 簽名認證原理 簽名認證實現 為什麼需要認證 場景 經由http協議進行通訊的資料大都是未經加密的明文,包括引數 返回值 cookie head資料,外界通過對通訊的監聽,可以輕而易舉的根據請求和響應的格式,偽造請求和響應。...
自簽名CA認證
用openssl命令生成自己的根證書,讓使用者安裝信任它,之後所有用這個根證書簽名的證書,就可以被信任。建立檔案並配置環境 先建立 root ca資料夾,所有ca的操作都會在這個資料夾執行。root ca ca資料夾 root ca certs 新簽署證書和根證書存放的位置 root ca crl ...
概念 數字簽名 傳統簽名和認證
什麼是數字簽名,和傳統的簽名有什麼不同。數字簽名和認證有什麼不同。1.概念 1 數字簽名,是只有資訊的傳送者才能產生的別人無法偽造的一段數字串。這段字串同時也是對傳送者傳送的資訊真實性的乙個有效證明。2 數字簽名是對非對稱金鑰加密技術和數字摘要技術的應用。作用 保證資訊傳輸的完整性,對傳送者進行身份...