1. 程式人生 > 實用技巧 >PHP 開發API介面簽名生成以及驗證

PHP 開發API介面簽名生成以及驗證

開發過程中,我們經常會與介面打交道,有的時候是調取別人網站的介面,有的時候是為他人提供自己網站的介面,但是在這調取的過程中都離不開簽名驗證。 我們在設計簽名驗證的時候,請注意要滿足以下幾點: 可變性:每次的簽名必須是不一樣的。 時效性:每次請求的時效,過期作廢等。 唯一性:每次的簽名是唯一的。 完整性:能夠對傳入資料進行驗證,防止篡改。
<?php
// 設定一個公鑰(key)和私鑰(secret),公鑰用於區分使用者,私鑰加密資料,不能公開
$key = "c4ca4238a0b923820dcc509a6f75849b";
$secret = "28c8edde3d61a0411511d3b1866f0636";
// 待發送的資料包
$data = array(
'username' => '[email protected]',
'sex' => '1',
'age' => '16',
'addr' =>
'guangzhou',
'key' => $key,
'timestamp' => time(),
);
// 獲取 sign function getSign(secret,secret,data) { // 對陣列的值按 key 排序 ksort($data);// 生成 url 的形式 $params = http_build_query($data);// 生成 sign $sign = md5($params . $secret); return $sign; } // 傳送的資料加上 sign data['sign'] = getSign(data[′sign′]=getSign(secret, $data);
/** 後臺驗證 sign 是否合法 @param [type] $secret [description] @param [type] $data [description] @return [type] [description]
*/ function verifySign(secret,secret,data) { // 驗證引數中是否有簽名 if (!isset($data['sign']) || !$data['sign']) { echo '傳送的資料簽名不存在'; die(); }if (!isset($data['timestamp']) || !$data['timestamp']) { echo '傳送的資料引數不合法'; die(); } // 驗證請求, 10 分鐘失效 if (time() - $data['timestamp'] > 600) { echo '驗證失效, 請重新發送請求'; die(); } $sign
= $data['sign'];unset($data['sign']); ksort($data); $params = http_build_query($data);// $secret 是通過 key 在 api 的資料庫中查詢得到 $sign2 = md5($params . $secret); if ($sign == $sign2) { die('驗證通過'); } else { die('請求不合法'); } } ?>