一文搞懂接口參數(shù)簽名與驗簽(附含java python php版)
引言
隨著前后端分離的開發(fā)模式的發(fā)展,接口安全顯得越來越重要。我們通常的做法是為接口的請求參數(shù)進行加密,也就是我們常說的“簽名與驗簽”。希望本篇筆記能幫助部分需要的小伙伴們。
說在前面:安全的方法不能局限于此?。?!本篇筆記僅供參考學(xué)習(xí)。
簽名步驟
既然要簽名(加密),那么我們一定要有自己的加密方法。以下為示例的加密步驟。
- 將所有的參數(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版)的詳細(xì)內(nèi)容,更多關(guān)于接口參數(shù)簽名驗簽的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于selenium-java封裝chrome、firefox、phantomjs實現(xiàn)爬蟲
這篇文章主要介紹了基于selenium-java封裝chrome、firefox、phantomjs實現(xiàn)爬蟲,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-10-10Spring容器的創(chuàng)建過程之如何注冊BeanPostProcessor詳解
關(guān)于BeanPostProcessor 各位一定不陌生,今天整理的這篇文章總結(jié)了如何注冊BeanPostProcessor,文中有非常詳細(xì)的圖文示例,需要的朋友可以參考下2021-06-06SpringBoot項目的漏洞修復(fù)經(jīng)驗分享
在局域網(wǎng)環(huán)境下,由于無法連接外網(wǎng)下載Maven包,常見解決方案是在外網(wǎng)環(huán)境搭建相同的開發(fā)環(huán)境以便更新Maven包,本次漏洞掃描包括Tomcat、jackson-databind、fastjson、logback等組件,通常解決方法是升級到更高版本2024-10-10Java Online Exam在線考試系統(tǒng)的實現(xiàn)
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+springboot+vue+jsp+mysql+maven實現(xiàn)Online Exam在線考試系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11永中文檔在線轉(zhuǎn)換服務(wù)Swagger調(diào)用說明
這篇文章主要為大家介紹了永中文檔在線轉(zhuǎn)換服務(wù)Swagger調(diào)用說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06實現(xiàn)quartz定時器及quartz定時器原理介紹
Quartz是一個大名鼎鼎的Java版開源定時調(diào)度器,功能強悍,使用方便,下面我們看看如何使用它2013-12-12詳解Java高并發(fā)編程之AtomicReference
此篇文章主要介紹了AtomicReference的出現(xiàn)背景,AtomicReference的使用場景,以及介紹了AtomicReference的源碼,重點方法的源碼分析2021-06-06java用list集合存儲學(xué)生信息并算出成績平均值操作
這篇文章主要介紹了java用list集合存儲學(xué)生信息并算出成績平均值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08