欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文搞懂接口參數(shù)簽名與驗(yàn)簽(附含java python php版)

 更新時(shí)間:2023年06月12日 10:23:39   作者:波波  
這篇文章主要為大家介紹了java python php不同版的接口參數(shù)簽名與驗(yàn)簽示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

隨著前后端分離的開(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)文章

最新評(píng)論