隨著互聯(lián)網(wǎng)的不斷發(fā)展,無(wú)論是電商、社交、金融等各種業(yè)務(wù)都逐漸向移動(dòng)端和云端轉(zhuǎn)移。而這些應(yīng)用都需要與第三方接口進(jìn)行通信,而很多時(shí)候接口的安全性就變得至關(guān)重要。PHP get sign技術(shù)就是一種常用的接口安全策略,下面就讓我們來(lái)深入探討這個(gè)知識(shí)點(diǎn)。
先來(lái)看一下什么是get sign。通俗點(diǎn)說(shuō),就是在請(qǐng)求接口時(shí)攜帶一個(gè)簽名(sign)字段,用來(lái)驗(yàn)證請(qǐng)求的合法性。具體來(lái)說(shuō),就是將請(qǐng)求參數(shù)按約定的規(guī)則進(jìn)行編碼、加密等操作,生成一個(gè)規(guī)定格式的數(shù)據(jù)串,再用指定的密鑰進(jìn)行加密,最后將這個(gè)加密字符串作為一個(gè)請(qǐng)求參數(shù)傳遞給接口。
下面舉個(gè)例子,比如我們有一個(gè)id為1001的用戶,他要訪問(wèn)一個(gè)需要token的接口,請(qǐng)求參數(shù)如下:
http://api.example.com/userinfo?userId=1001&token=abcd
這時(shí)候,我們要對(duì)這個(gè)請(qǐng)求參數(shù)進(jìn)行加密,生成簽名。一般來(lái)說(shuō),我們會(huì)定義一個(gè)計(jì)算簽名的函數(shù),這個(gè)函數(shù)的作用就是根據(jù)輸入的參數(shù),按照一定規(guī)則來(lái)生成簽名。PHP代碼實(shí)現(xiàn)如下:
function getSign($params, $secret) { ksort($params); $stringToBeSigned = $secret; foreach ($params as $k =>$v) { $stringToBeSigned .= "$k$v"; } $stringToBeSigned .= $secret; return strtoupper(md5($stringToBeSigned)); }
上面的代碼中,$params是一個(gè)請(qǐng)求參數(shù)的關(guān)聯(lián)數(shù)組,$secret是我們事先分配好的密鑰。這個(gè)函數(shù)的思路比較簡(jiǎn)單,就是按照參數(shù)名進(jìn)行排序,然后將參數(shù)名和參數(shù)值拼接成一個(gè)長(zhǎng)字符串,最后再在頭尾添加密鑰,用MD5加密。最終得到的簽名就可以加入請(qǐng)求參數(shù)中了。
還是以上面的例子為例,如果我們的密鑰是hello,那么調(diào)用getSign函數(shù)給這個(gè)請(qǐng)求參數(shù)生成簽名的代碼如下:
$params = [ 'userId' =>'1001', 'token' =>'abcd', ]; $secret = 'hello'; $sign = getSign($params, $secret); $params['sign'] = $sign;
經(jīng)過(guò)這個(gè)處理之后,原來(lái)的請(qǐng)求參數(shù)就變成了:
http://api.example.com/userinfo?userId=1001&token=abcd&sign=0B1A3C183A03913A94DF717E71D7F7F0
其中,sign就是我們加入的簽名串。接收方在收到這個(gè)請(qǐng)求時(shí),只需要按照相同的方法來(lái)計(jì)算簽名,然后跟請(qǐng)求參數(shù)中的sign字段進(jìn)行比較就可以判斷請(qǐng)求是否合法。
當(dāng)然,這只是get sign的一個(gè)簡(jiǎn)單應(yīng)用示例。在實(shí)際的應(yīng)用中,還需要考慮很多其他的問(wèn)題,比如簽名算法的安全性、密鑰的保護(hù)、簽名參數(shù)的選擇等等。但是無(wú)論如何,get sign技術(shù)都是一種非常實(shí)用的接口安全策略,能夠有效保障接口的安全性和可靠性。