關於平臺接入:簽名驗證

前段時間獨立作了幾個平臺的接入,譬如生活信息分類平臺的訂單接入、百度應用內搜索的社區內容接入。這裏總結一下平臺接入的相關事宜。php

簽名驗證

簽名驗證是接入平臺須要最早完成的工做。哪怕是本身系統的接口請求,或者是本身公司移動端的App請求網站接口也須要作好籤名驗證,防止跨域的攻擊或者網絡爬蟲對系統形成意想不到的問題。算法

1. 最偷懶的辦法

最簡單的簽名驗證就是在請求的URL里加上一段特定的字符串。譬如你的接口地址在http://yourhost/index.php?controller=apilist&action=oneApi,你能夠在URL末尾加上一個參數,好比說key=meiyouqianming,而後在你的代碼裏驗證一下是否存在參數key,其值是否是meiyouqianming(沒有簽名)就行了。簡直偷懶到家。json

2. 利用sha一、md5之類的算法生成簽名

另外有將平臺提供的secret_key與請求參數作hash_hmac運算生成一個簽名字符串,而後一塊兒傳到服務器上。目標服務器從新作一次運算檢查是否傳來的簽名與生成的簽名是否相符,相符則驗證經過。
寫一段簡單的代碼演示一下api

<?php
/**
 * 生成簽名
 */
function makeSign($params, $secret_key) {
    // 將參數拼接成字符串
    $paramString = '';
    foreach ($params as $key to $value) {
        $paramString .= $key . '=' . $value;
    }
    
    // 參數字符串與secret_key作hash_hmac運算
    // 這裏選用sha1算法
    $sign = hash_hmac('sha1', $paramString, $secret_key);
    return $sign;
}

/**
 * 檢查簽名
 */
function checkSign($params, $secret_key) {
    // 將參數內的sign提取,並銷燬$params中的sign
    if (isset($params['sign'])) {
        $oldSign = $params['sign'];
        unset($params['sign']);
    } else {
        return false;
    }
    
    // 利用$params和$secret_key生成簽名並檢查
    $newSign = makeSign($params, $secret_key);
    
    return $oldSign == $newSign;
}

3. 能夠加密解密的算法

其實就是經過mcrypt之類的拓展庫,對請求參數進行加密,防止抓包獲取請求參數。大體就是先將傳參拼接成字符串,而後使用拓展庫提供的方法將字符串加密,到目標服務器上對字符串解密獲取請求參數。這塊很少贅述,若是對傳參安全有更高的要求,推薦使用這種方法。跨域

使用拓展庫的缺點是,正式環境上最好不要裝這麼多的拓展,以避免影響服務器的運行速度(雖然如今服務器的性能都很是好)。並且遇到須要在開發或者部署中使用拓展庫時,每每須要暫時停掉服務器,而後安裝新的拓展,蛋疼。安全

關於簽名

  1. 和小公司作對接時,永遠不要相信文檔!永遠不要相信文檔!永遠不要相信文檔!請直接和對方的技術人員溝通。服務器

  2. 注意一下響應的格式和字符集,通常推薦在php代碼前加一個header()函數強制把頁面轉換成json格式或者xml格式的文檔。不加header可能沒事,可是你也不知道對方服務器會出現什麼問題。網絡

  3. 若是一時半會你的簽名驗證完成不了,好比對方技術人員不在,沒法及時解決接入問題,趕忙去寫別的代碼。簽名驗證是小事情,完成KPI才比較重要。函數

相關文章
相關標籤/搜索