一文搞懂接口參數(shù)簽名與驗(yàn)簽(附含java python php版)
引言
隨著前后端分離的開(kāi)發(fā)模式的發(fā)展,接口安全顯得越來(lái)越重要。我們通常的做法是為接口的請(qǐng)求參數(shù)進(jìn)行加密,也就是我們常說(shuō)的“簽名與驗(yàn)簽”。希望本篇筆記能幫助部分需要的小伙伴們。
說(shuō)在前面:安全的方法不能局限于此?。?!本篇筆記僅供參考學(xué)習(xí)。
簽名步驟
既然要簽名(加密),那么我們一定要有自己的加密方法。以下為示例的加密步驟。
- 將所有的參數(shù)進(jìn)行字典排序;
- 將排序后的數(shù)組key與value用“&”符號(hào)連接。生成類(lèi)似Get請(qǐng)求的參數(shù)格式。如:
tel=15588888888&passwd=123456×tamp=165031031
- 將第二步生成的字符串參數(shù)進(jìn)行MD5加密;
- 將第三步生成的簽名轉(zhuǎn)換為大寫(xiě);
簽名方法(PHP版)
/** ?*?Sign簽名方法 ?*?@param?array?$param?待簽名的參數(shù) ?*?@param?string?$key?請(qǐng)求方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ù)說(shuō)明:
$param
請(qǐng)求主體參數(shù),數(shù)組形式,不包含Key;$key
為了安全起見(jiàn)建議將Key放在請(qǐng)求的Header部分,具體鍵值雙方約定即可,常見(jiàn)的是放入Hrader部分的Authorization
、App-Key
等;
簽名驗(yàn)證
簽名的驗(yàn)證非常簡(jiǎn)單,只需一行代碼判斷請(qǐng)求體中的Sign簽名與簽名結(jié)果是否一致即可。示例如下:
- var_dump($param['sign'] == generateToken($param,$key));
- //返回布爾類(lèi)型true或false
其他語(yǔ)言拓展:
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?請(qǐng)求方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)簽的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于selenium-java封裝chrome、firefox、phantomjs實(shí)現(xiàn)爬蟲(chóng)
這篇文章主要介紹了基于selenium-java封裝chrome、firefox、phantomjs實(shí)現(xiàn)爬蟲(chóng),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2020-10-10Spring容器的創(chuàng)建過(guò)程之如何注冊(cè)BeanPostProcessor詳解
關(guān)于BeanPostProcessor 各位一定不陌生,今天整理的這篇文章總結(jié)了如何注冊(cè)BeanPostProcessor,文中有非常詳細(xì)的圖文示例,需要的朋友可以參考下2021-06-06SpringBoot項(xiàng)目的漏洞修復(fù)經(jīng)驗(yàn)分享
在局域網(wǎng)環(huán)境下,由于無(wú)法連接外網(wǎng)下載Maven包,常見(jiàn)解決方案是在外網(wǎng)環(huán)境搭建相同的開(kāi)發(fā)環(huán)境以便更新Maven包,本次漏洞掃描包括Tomcat、jackson-databind、fastjson、logback等組件,通常解決方法是升級(jí)到更高版本2024-10-10Java Online Exam在線考試系統(tǒng)的實(shí)現(xiàn)
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+springboot+vue+jsp+mysql+maven實(shí)現(xiàn)Online Exam在線考試系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-11-11永中文檔在線轉(zhuǎn)換服務(wù)Swagger調(diào)用說(shuō)明
這篇文章主要為大家介紹了永中文檔在線轉(zhuǎn)換服務(wù)Swagger調(diào)用說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06實(shí)現(xiàn)quartz定時(shí)器及quartz定時(shí)器原理介紹
Quartz是一個(gè)大名鼎鼎的Java版開(kāi)源定時(shí)調(diào)度器,功能強(qiáng)悍,使用方便,下面我們看看如何使用它2013-12-12詳解Java高并發(fā)編程之AtomicReference
此篇文章主要介紹了AtomicReference的出現(xiàn)背景,AtomicReference的使用場(chǎng)景,以及介紹了AtomicReference的源碼,重點(diǎn)方法的源碼分析2021-06-06java用list集合存儲(chǔ)學(xué)生信息并算出成績(jī)平均值操作
這篇文章主要介紹了java用list集合存儲(chǔ)學(xué)生信息并算出成績(jī)平均值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08