PHP API 簽名驗證
在當前互聯網時代,API接口的使用越來越普及。API是指應用程序接口,它是指不同應用之間數據交互的接口。一些手機 APP 或網站都需要使用 API 的方式來調用數據或使用第三方服務,這時候 API 就顯得非常重要。在API使用中,為了保證接口請求的安全性,接口通常都需要簽名驗證。
什么是API簽名驗證?
API簽名驗證是指客戶端在每次調用 API 請求前需要通過驗證來保證請求的合法性,防止被惡意攻擊。一般情況下,簽名驗證必須包含客戶端的身份驗證和數據完整性驗證,也就是確保發送請求的客戶端是當前系統的合法用戶,同時發送請求的數據沒有被惡意篡改或者中途被其他人攔截。簽名驗證一般適用于 HTTP 協議的 WEB 服務接口,常見并使用最多的是 HMAC-SHA1、MD5 等加密算法。
API簽名過程
API簽名的流程大致如下:
define('SECRET_KEY', 'your secret key'); $requestData = [ 'api_key' =>'your api key', 'timestamp' =>time(), ]; // 1. 對數組按key遞增排序 ksort($requestData); // 2. 拼接key=value形式 $str = ''; foreach ($requestData as $key =>$value) { $str .= $key . '=' . $value . '&'; } // 3. 添加密鑰 $str .= SECRET_KEY; // 4. sha1, 獲得簽名值 $sign = sha1($str); // 5. 添加簽名到requestData數組 $requestData['sign'] = $sign;
首先需要準備一個密鑰 SECRET_KEY 和調用 API 需要的參數 requestData,requestData 中必須包含 publicKey 和時間戳 timestamp。代碼中的簽名過程主要包含以下幾個步驟:
- 按照 鍵(key)值升序排序 requestData 關聯數組,這個排序有助于保證簽名的一致性。
- 將鍵值對通過 key1=value1&key2=value2&...keyn=valuen 的方式拼接起來。
- 拼接秘鑰 SECRET_KEY 到這個待簽名的字符末尾。
- 使用 sha1 哈希算法對簽名字符進行哈希計算。
- 將哈希值添加到 requestData 中,以便 API 服務器與客戶端都進行驗證。
API簽名驗證過程
有了簽名值之后,我們就可以去調用目標API接口了。當然,先得先將我們簽名獲得后得到的 sign 讓 Amada 服務器進行驗證。過程如下:
define('SECRET_KEY', 'your secret key'); // 1. 獲取所有的表單數據 $requestData = $_POST; // 2. 請求參數、時間戳與簽名分離 $sign = $requestData['sign']; unset($requestData['sign']); // 3. 請求參數按遞增排序 ksort($requestData); // 4. 參數拼接 &,不需要urlencode,空值不參與簽名 $str = ''; $comma = ''; foreach($requestData as $k =>$v) { if($v === '' || (is_array($v) && empty($v))) { continue; } $str .= $comma.$k.'='.$v; $comma = '&'; } // 5. 拼接 SECRET KEY $str .= SECRET_KEY; // 6. sha1加密 $checksum = sha1($str); // 7. 驗證簽名值 if (strcasecmp($sign, $checksum) !== 0) { return false; } return true;
在客戶端完成了簽名的動作后,我們的服務器端就需要對簽名進行驗證。整個驗證過程包含以下幾個步驟:
- 獲取所有的表單數據,也就是 API 發來的數據。
- 將參數、時間戳和簽名值分離,其中時間戳從客戶端傳遞過來,可用于保證請求時間的合法性。
- 對客戶端請求的參數進行遞增排序,由于客戶端發送請求時,會按照名稱順序進行排序,因此必須按照相同的方式對各個參數進行排序。
- 將參數名與值用&符號連接起來,生成簽名字符串。
- 將 SECRET_KEY 添加到簽名字符串后面,并計算 SHA1 散列值。
- 將計算產生的哈希值(即checksum)與請求中的簽名值進行比較,如果不一樣,表示加密不正確,驗證失敗,否則,表示加密正確,驗證通過。
總結
API是多個應用程序之間交互數據的橋梁,簽名驗證是API中非常關鍵的環節,通過上述的流程,我們可以保證發送請求的客戶端是合法的,讓數據交互更加安全可靠。同時,我們還需要注意密鑰等敏感數據的保護,防止泄漏造成大量用戶數據被攻擊的風險。