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

說在前面:安全的方法不能局限于此?。?!本篇筆記僅供參考學(xué)習(xí)。
簽名步驟
既然要簽名(加密),那么我們一定要有自己的加密方法。以下為示例的加密步驟。
- 將所有的參數(shù)進(jìn)行字典排序;
- 將排序后的數(shù)組key與value用“&”符號連接。生成類似Get請求的參數(shù)格式。如:
tel=15588888888&passwd=123456×tamp=165031031 - 將第二步生成的字符串參數(shù)進(jìn)行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等;
簽名驗(yàn)證
簽名的驗(yàn)證非常簡單,只需一行代碼判斷請求體中的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);
????//?計(jì)算MD5簽名
????return?getMD5(sb.toString()).toUpperCase();
??}
??/**
???*?計(jì)算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}'
????#?計(jì)算MD5簽名
????return?hashlib.md5(buff.encode('utf-8')).hexdigest().upper()以上就是一文搞懂接口參數(shù)簽名與驗(yàn)簽(附含java python php版)的詳細(xì)內(nèi)容,更多關(guān)于接口參數(shù)簽名驗(yàn)簽的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java實(shí)現(xiàn)監(jiān)控rtsp流轉(zhuǎn)flv方法實(shí)例(前端播放,前后端代碼都有)
這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)監(jiān)控rtsp流轉(zhuǎn)flv的相關(guān)資料,文中介紹的是前端播放,前后端代碼都有,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
RabbitMQ 功能詳解與高可靠實(shí)現(xiàn)指南(最新推薦)
本文給大家介紹RabbitMQ功能詳解與高可靠實(shí)現(xiàn)指南,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2025-10-10
SpringBoot項(xiàng)目中使用緩存Cache的正確方法分享
緩存可以通過將經(jīng)常訪問的數(shù)據(jù)存儲在內(nèi)存中,減少底層數(shù)據(jù)源如數(shù)據(jù)庫的壓力,從而有效提高系統(tǒng)的性能和穩(wěn)定性。本文就來講講SpringBoot項(xiàng)目中使用緩存Cache的正確姿勢吧2023-04-04
SpringBoot整合sharding-jdbc實(shí)現(xiàn)自定義分庫分表的實(shí)踐
本文主要介紹了SpringBoot整合sharding-jdbc實(shí)現(xiàn)自定義分庫分表的實(shí)踐,將通過自定義算法來實(shí)現(xiàn)定制化的分庫分表來擴(kuò)展相應(yīng)業(yè)務(wù),感興趣的可以了解一下2021-11-11
Java正則表達(dá)式匹配字符串并提取中間值的方法實(shí)例
正則表達(dá)式常用于字符串處理、表單驗(yàn)證等場合,實(shí)用高效,下面這篇文章主要給大家介紹了關(guān)于Java正則表達(dá)式匹配字符串并提取中間值的相關(guān)資料,需要的朋友可以參考下2022-06-06
Java+WebSocket實(shí)現(xiàn)簡單實(shí)時(shí)雙人協(xié)同pk答題系統(tǒng)
在實(shí)時(shí)互動(dòng)應(yīng)用中,實(shí)現(xiàn)流暢的多人協(xié)同對戰(zhàn)功能是一大挑戰(zhàn),WebSocket技術(shù),以其全雙工通信能力,提供了解決方案,本文我們就來使用WebSocket實(shí)現(xiàn)簡單實(shí)時(shí)雙人協(xié)同pk答題系統(tǒng)吧2025-06-06

