一文搞懂接口參數(shù)簽名與驗簽(附含java python php版)
引言
隨著前后端分離的開發(fā)模式的發(fā)展,接口安全顯得越來越重要。我們通常的做法是為接口的請求參數(shù)進行加密,也就是我們常說的“簽名與驗簽”。希望本篇筆記能幫助部分需要的小伙伴們。

說在前面:安全的方法不能局限于此!!!本篇筆記僅供參考學習。
簽名步驟
既然要簽名(加密),那么我們一定要有自己的加密方法。以下為示例的加密步驟。
- 將所有的參數(shù)進行字典排序;
- 將排序后的數(shù)組key與value用“&”符號連接。生成類似Get請求的參數(shù)格式。如:
tel=15588888888&passwd=123456×tamp=165031031 - 將第二步生成的字符串參數(shù)進行MD5加密;
- 將第三步生成的簽名轉(zhuǎn)換為大寫;
簽名方法(PHP版)
/**
?*?Sign簽名方法
?*?@param?array?$param?待簽名的參數(shù)
?*?@param?string?$key?請求方Key
?*?@return?string?簽名
?*?@throws?\think\Exception
?*/
function?generateToken(array?$param,string?$key=''):string{
????if(emptyempty($param))?throw?new?\think\Exception('參數(shù)不能為空');
????ksort($param);
????if?(isset($param['sign']))?unset($param['sign']);
????foreach?($param?as?$k?=>?$v)?{
????????if?(''?===?$v?||?null?===?$v)?continue;
????????$buff?.=?"{$k}={$v}&";
????}
????$buff?.=?("key="?.?$key);
????return?strtoupper(md5($buff));
}參數(shù)說明:
$param請求主體參數(shù),數(shù)組形式,不包含Key;$key為了安全起見建議將Key放在請求的Header部分,具體鍵值雙方約定即可,常見的是放入Hrader部分的Authorization、App-Key等;
簽名驗證
簽名的驗證非常簡單,只需一行代碼判斷請求體中的Sign簽名與簽名結(jié)果是否一致即可。示例如下:
- var_dump($param['sign'] == generateToken($param,$key));
- //返回布爾類型true或false
其他語言拓展:
1、Java版簽名加密方法
import?java.util.Map;
import?java.util.TreeMap;
import?java.security.MessageDigest;
import?java.security.NoSuchAlgorithmException;
public?class?SignUtil?{
??/**
???*?Sign簽名方法
???*
???*?@param?param?待簽名的參數(shù)
???*?@param?key?請求方Key
???*?@return?簽名
???*?@throws?Exception
???*/
??public?static?String?generateToken(Map<String,?String>?param,?String?key)?throws?Exception?{
????if?(param.isEmpty())?{
??????throw?new?Exception("參數(shù)不能為空");
????}
????//?將參數(shù)按照ASCII碼從小到大排序
????Map<String,?String>?sortedParam?=?new?TreeMap<>(param);
????//?拼接參數(shù)
????StringBuilder?sb?=?new?StringBuilder();
????for?(Map.Entry<String,?String>?entry?:?sortedParam.entrySet())?{
??????String?k?=?entry.getKey();
??????String?v?=?entry.getValue();
??????if?(v?!=?null?&&?!v.equals(""))?{
????????sb.append(k).append("=").append(v).append("&");
??????}
????}
????sb.append("key=").append(key);
????//?計算MD5簽名
????return?getMD5(sb.toString()).toUpperCase();
??}
??/**
???*?計算MD5簽名
???*
???*?@param?str?待簽名的原始字符串
???*?@return?MD5簽名
???*?@throws?NoSuchAlgorithmException
???*/
??private?static?String?getMD5(String?str)?throws?NoSuchAlgorithmException?{
????MessageDigest?md?=?MessageDigest.getInstance("MD5");
????byte[]?bytes?=?md.digest(str.getBytes());
????StringBuilder?sb?=?new?StringBuilder();
????for?(byte?b?:?bytes)?{
??????String?hex?=?Integer.toHexString(b?&?0xff);
??????if?(hex.length()?==?1)?{
????????sb.append("0");
??????}
??????sb.append(hex);
????}
????return?sb.toString();
??}
}2、Python版簽名加密方法
import?hashlib
def?generateToken(param:?dict,?key:?str)?->?str:
????if?not?param:
????????raise?Exception('參數(shù)不能為空')
????#?將參數(shù)按照ASCII碼從小到大排序
????sortedParam?=?dict(sorted(param.items()))
????#?拼接參數(shù)
????buff?=?''
????for?k,?v?in?sortedParam.items():
????????if?v?is?not?None?and?v?!=?'':
????????????buff?+=?f'{k}={v}&'
????buff?+=?f'key={key}'
????#?計算MD5簽名
????return?hashlib.md5(buff.encode('utf-8')).hexdigest().upper()以上就是一文搞懂接口參數(shù)簽名與驗簽(附含java python php版)的詳細內(nèi)容,更多關于接口參數(shù)簽名驗簽的資料請關注腳本之家其它相關文章!
相關文章
java實現(xiàn)監(jiān)控rtsp流轉(zhuǎn)flv方法實例(前端播放,前后端代碼都有)
這篇文章主要給大家介紹了關于java實現(xiàn)監(jiān)控rtsp流轉(zhuǎn)flv的相關資料,文中介紹的是前端播放,前后端代碼都有,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-06-06
RabbitMQ 功能詳解與高可靠實現(xiàn)指南(最新推薦)
本文給大家介紹RabbitMQ功能詳解與高可靠實現(xiàn)指南,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2025-10-10
SpringBoot整合sharding-jdbc實現(xiàn)自定義分庫分表的實踐
本文主要介紹了SpringBoot整合sharding-jdbc實現(xiàn)自定義分庫分表的實踐,將通過自定義算法來實現(xiàn)定制化的分庫分表來擴展相應業(yè)務,感興趣的可以了解一下2021-11-11
Java+WebSocket實現(xiàn)簡單實時雙人協(xié)同pk答題系統(tǒng)
在實時互動應用中,實現(xiàn)流暢的多人協(xié)同對戰(zhàn)功能是一大挑戰(zhàn),WebSocket技術,以其全雙工通信能力,提供了解決方案,本文我們就來使用WebSocket實現(xiàn)簡單實時雙人協(xié)同pk答題系統(tǒng)吧2025-06-06

