日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

简单API接口签名验证

發布時間:2025/3/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单API接口签名验证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

后端在寫對外的API接口時,一般會對參數進行簽名來保證接口的安全性,在設計簽名算法的時候,主要考慮的是這幾個問題: 1. 請求的來源是否合法 2. 請求參數是否被篡改 3. 請求的唯一性 我們的簽名加密也是主要針對這幾個問題來實現

設計

基于上述的幾個問題,我們來通過已下步驟來實現簽名加密: 1. 通過分配給APP對應的app_key和app_secret來驗證身份 2. 通過將請求的所有參數按照字母先后順序排序后拼接再MD5加密老保證請求參數不被篡改 3. 請求里攜帶時間戳參數老保證請求的唯一和過期,重復的請求在指定時間(可配置)內有效

實現

  • 簽名生成:

  • 生成當前時間戳timestamp=now
  • 按照請求參數名的字母升序排列非空請求參數(包含accessKey)
    stringA="AccessKey=access&home=world&name=hello&work=java&timestamp=now&nonce=random";
  • 拼接密鑰accessSecret
    stringSignTemp="AccessKey=access&home=world&name=hello&work=java&timestamp=now&nonce=random&accessSecret=secret";
  • MD5并轉換為大寫生成簽名
    sign=MD5(stringSignTemp).toUpperCase();
  • JAVA代碼如下:params是從request里面獲取的所有參數map,accessSecret是加密密鑰

    private String createSign(Map<String, Object> params, String accessSecret) throws UnsupportedEncodingException {Set<String> keysSet = params.keySet();Object[] keys = keysSet.toArray();Arrays.sort(keys);StringBuilder temp = new StringBuilder();boolean first = true;for (Object key : keys) {if (first) {first = false;} else {temp.append("&");}temp.append(key).append("=");Object value = params.get(key);String valueString = "";if (null != value) {valueString = String.valueOf(value);}temp.append(valueString);}temp.append("&").append(ACCESS_SECRET).append("=").append(accessSecret);return MD5Util.MD52(temp.toString()).toUpperCase();}
  • 簽名校驗:

    攔截器部分代碼

    • 參數格式校驗
    • 超時校驗
    • 驗證簽名
  • public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {Map<String, Object> result = new HashMap<String, Object>();String timestamp = request.getParameter(TIMESTAMP_KEY);String accessKey = request.getParameter(ACCESS_KEY);String accessSecret = map.get(accessKey);if (!org.apache.commons.lang.StringUtils.isNumeric(timestamp)) {result.put("code", 1000);result.put("msg", "請求時間戳不合法");WebUtils.writeJsonByObj(result, response, request);return false;}// 檢查KEY是否合理if (StringUtils.isEmpty(accessKey) || StringUtils.isEmpty(accessSecret)) {result.put("code", 1001);result.put("msg", "加密KEY不合法");WebUtils.writeJsonByObj(result, response, request);return false;}Long ts = Long.valueOf(timestamp);// 禁止超時簽名if (System.currentTimeMillis() - ts > SIGN_EXPIRED_TIME) {result.put("code", 1002);result.put("msg", "請求超時");WebUtils.writeJsonByObj(result, response, request);return false;}if (!verificationSign(request, accessKey, accessSecret)) {result.put("code", 1003);result.put("msg", "簽名錯誤");WebUtils.writeJsonByObj(result, response, request);return false;}return true;}

    校驗簽名

    private boolean verificationSign(HttpServletRequest request, String accessKey, String accessSecret) throws UnsupportedEncodingException {Enumeration<?> pNames = request.getParameterNames();Map<String, Object> params = new HashMap<String, Object>();while (pNames.hasMoreElements()) {String pName = (String) pNames.nextElement();if (SIGN_KEY.equals(pName)) continue;Object pValue = request.getParameter(pName);params.put(pName, pValue);}String originSign = request.getParameter(SIGN_KEY);String sign = createSign(params, accessSecret);return sign.equals(originSign);}
  • 完整代碼:

    這里通過攔截器來實現接口攔截,可自行替換

  • package com.mlcs.mop.common.web.interceptor;import com.mlcs.core.conf.ZKClient; import com.mlcs.mop.common.web.util.MD5Util; import com.mlcs.mop.common.web.util.WebUtils; import org.apache.zookeeper.KeeperException; import org.springframework.util.StringUtils; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.util.*; import java.util.concurrent.ConcurrentHashMap;/*** Author: Kelin* Date: 2018/5/16* Description:*/ @SuppressWarnings("SuspiciousMethodCalls") public class SimpleApiSignInterceptor extends HandlerInterceptorAdapter {// 簽名超時時長,默認時間為5分鐘,msprivate static final int SIGN_EXPIRED_TIME = 5 * 60 * 1000;private static final String API_SIGN_KEY_CONFIG_PATH = "/mop/common/system/api_sign_key_mapping.properties";private static final String SIGN_KEY = "sign";private static final String TIMESTAMP_KEY = "timestamp";private static final String ACCESS_KEY = "accessKey";private static final String ACCESS_SECRET = "accessSecret";private static Map<String, String> map = new ConcurrentHashMap<String, String>();static {// 從zk加載key映射到內存里面try {String data = ZKClient.get().getStringData(API_SIGN_KEY_CONFIG_PATH);Properties properties = new Properties();properties.load(new StringReader(data));for (Object key : properties.keySet()) {map.put(String.valueOf(key), properties.getProperty(String.valueOf(key)));}} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {Map<String, Object> result = new HashMap<String, Object>();String timestamp = request.getParameter(TIMESTAMP_KEY);String accessKey = request.getParameter(ACCESS_KEY);String accessSecret = map.get(accessKey);if (!org.apache.commons.lang.StringUtils.isNumeric(timestamp)) {result.put("code", 1000);result.put("msg", "請求時間戳不合法");WebUtils.writeJsonByObj(result, response, request);return false;}// 檢查KEY是否合理if (StringUtils.isEmpty(accessKey) || StringUtils.isEmpty(accessSecret)) {result.put("code", 1001);result.put("msg", "加密KEY不合法");WebUtils.writeJsonByObj(result, response, request);return false;}Long ts = Long.valueOf(timestamp);// 禁止超時簽名if (System.currentTimeMillis() - ts > SIGN_EXPIRED_TIME) {result.put("code", 1002);result.put("msg", "請求超時");WebUtils.writeJsonByObj(result, response, request);return false;}if (!verificationSign(request, accessKey, accessSecret)) {result.put("code", 1003);result.put("msg", "簽名錯誤");WebUtils.writeJsonByObj(result, response, request);return false;}return true;}private boolean verificationSign(HttpServletRequest request, String accessKey, String accessSecret) throws UnsupportedEncodingException {Enumeration<?> pNames = request.getParameterNames();Map<String, Object> params = new HashMap<String, Object>();while (pNames.hasMoreElements()) {String pName = (String) pNames.nextElement();if (SIGN_KEY.equals(pName)) continue;Object pValue = request.getParameter(pName);params.put(pName, pValue);}String originSign = request.getParameter(SIGN_KEY);String sign = createSign(params, accessSecret);return sign.equals(originSign);}private String createSign(Map<String, Object> params, String accessSecret) throws UnsupportedEncodingException {Set<String> keysSet = params.keySet();Object[] keys = keysSet.toArray();Arrays.sort(keys);StringBuilder temp = new StringBuilder();boolean first = true;for (Object key : keys) {if (first) {first = false;} else {temp.append("&");}temp.append(key).append("=");Object value = params.get(key);String valueString = "";if (null != value) {valueString = String.valueOf(value);}temp.append(valueString);}temp.append("&").append(ACCESS_SECRET).append("=").append(accessSecret);return MD5Util.MD52(temp.toString()).toUpperCase();} }

    轉載于:https://www.cnblogs.com/Kelin-/p/9475886.html

    總結

    以上是生活随笔為你收集整理的简单API接口签名验证的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 69av在线| 视频这里只有精品 | 精品裸体舞一区二区三区 | 精品777| av啊啊 | 黄色一级生活片 | 97超级碰碰碰| 99riav国产精品 | 久久久久久国产精品一区 | 性歌舞团一区二区三区视频 | 污污小视频 | 在线不卡日本 | 亚洲欧洲久久久 | 久久久精品网 | 小明成人免费视频 | 午夜精品久久久久久久第一页按摩 | 在线黄色av| 狠狠干2020| 国产精品三级在线观看 | 亚洲乱码国产乱码精品天美传媒 | 亚洲av成人无码久久精品老人 | 五月天av网站 | 国产精品午夜电影 | 在线看片网站 | 综合久色 | 国产日韩在线免费观看 | 91看片黄色| 丰满岳乱妇在线观看中字无码 | 天堂а在线中文在线新版 | 日本a在线 | 福利姬在线播放 | 丝袜综合网 | 成人黄网免费观看视频 | 久久久久久免费视频 | 一区二区三区免费看 | 国产欧美亚洲精品 | 欧美日韩电影一区 | 日本黄色网页 | 日韩福利小视频 | 在线观看国产三级 | 岛国福利视频 | 在线观看亚洲一区二区 | 日本69少妇 | 国产一区二区免费视频 | 少妇一晚三次一区二区三区 | 好男人影视www | 樱桃国产成人精品视频 | 99er久久| 日本亚洲色大成网站www久久 | 另类第一页 | 久久久国产视频 | 欧美精品在线免费 | 亚洲性生活 | av免费网页| 欧美夜夜操 | 免费av影视| 日韩精品在线观看一区 | 成人午夜精品一区二区三区 | 精品自拍视频 | 91av在| 国产精品免费视频观看 | 国产精品久久久爽爽爽麻豆色哟哟 | 欧洲性生活片 | 卡一卡二视频 | 黄色网址你懂得 | a亚洲天堂 | 国产一级在线观看视频 | av中文一区| 国产一级大片在线观看 | 国产 欧美 日韩 | 天天艹日日干 | 日韩精品在线一区二区 | 中出少妇 | 国产在线精 | 国产在线中文字幕 | 色在线播放 | 亚洲免费一级 | 黑人性视频 | 欲求不满在线小早川怜子 | 欧洲精品视频在线观看 | 欧亚乱熟女一区二区在线 | 三级男人添奶爽爽爽视频 | 亚洲国产一级 | 国产欧美一区二区三区精品酒店 | 在线午夜电影 | 成人在线免费观看网址 | 国产又粗又猛又爽又黄的网站 | 成人黄色在线网站 | 中国一级特黄真人毛片免费观看 | 人民的名义第二部 | 欧美黑人性受xxxx精品 | 91玉足脚交嫩脚丫在线播放 | 永久看看免费大片 | www国产视频 | 伊人一区二区三区四区 | 4438五月天| 最新色网站 | 国产成人a人亚洲精品无码 在线aa | 福利视频免费看 |