在工作中經(jīng)常遇見(jiàn)項(xiàng)目對(duì)接,那么該如何寫(xiě)一個(gè)安全的接口供給對(duì)方調(diào)用呢???
1.公共接口,任何人都可以訪問(wèn)調(diào)用
1.1.適合場(chǎng)景,公司后臺(tái)整合廣告管理,提供統(tǒng)一的接口返回給公司其他項(xiàng)目調(diào)用和郵件模板調(diào)用,這時(shí)候需要設(shè)計(jì)一個(gè)統(tǒng)一的接口,返回廣告的內(nèi)容。還有天氣查詢(xún)等場(chǎng)景。
@PostMapping("/syncInfo") public Result syncInfo(@RequestParam(name = "data")String data){ if(!StringUtils.isNotBlank(data)){ return new Result("失敗!",false,HttpCode.STATUS_104); } InfoVo infoVo = JSONObject.parseObject(data,InfoVo.class); dealInfo(infoVo); return new Result("成功!",true, HttpCode.STATUS_200); }
2.接口參數(shù)加密
2.1.適合場(chǎng)景,公司內(nèi)部?jī)蓚€(gè)項(xiàng)目組進(jìn)行對(duì)接,為了防止接口被暴露和偽造訪問(wèn),這個(gè)時(shí)候需要對(duì)參數(shù)進(jìn)行加密處理,防止接口被其他外部人員調(diào)用,一般采用desc或者aes對(duì)稱(chēng)加密,約定好秘鑰進(jìn)行對(duì)接。
@PostMapping("/syncInfo") public Result syncInfo(@RequestParam(name = "data")String data){ try { if(!StringUtils.isNotBlank(data)){ return new Result("失敗!",false,HttpCode.STATUS_104); } DES des = new DES("秘鑰".getBytes()); String j = des.decryptStr(data); logger.debug("解碼前:" + data); logger.debug("解碼后:" + j); InfoVo infoVo = JSONObject.parseObject(j,InfoVo.class); dealInfo(infoVo); return new Result("成功!",true, HttpCode.STATUS_200); }catch (Exception e){ e.printStackTrace(); if(!StringUtils.isNotBlank(data)){ return new Result("系統(tǒng)錯(cuò)誤!",false,HttpCode.STATUS_105); } } }
3.接口時(shí)效性加密+接口參數(shù)加密
3.1.適合場(chǎng)景,內(nèi)部接口加密過(guò)的數(shù)據(jù)鏈接被暴露,不斷有相同數(shù)據(jù)對(duì)接口進(jìn)行訪問(wèn),這個(gè)適合需要對(duì)接口加入時(shí)間戳參數(shù),設(shè)計(jì)失效時(shí)間解決這個(gè)問(wèn)題。
@PostMapping("/syncInfo") public Result syncInfo(@RequestParam(name = "data")String data){ try { if(!StringUtils.isNotBlank(data)){ return new Result("失敗!",false,HttpCode.STATUS_104); } DES des = new DES("秘鑰".getBytes()); String j = des.decryptStr(data); logger.debug("解碼前:" + data); logger.debug("解碼后:" + j); InfoVo infoVo = JSONObject.parseObject(j,InfoVo.class); if(AddSecondes(infoVo.getTime(),20) < new Date().getTime()){ return new Result("接口失效!",false,HttpCode.STATUS_100); } dealInfo(infoVo); return new Result("成功!",true, HttpCode.STATUS_200); }catch (Exception e){ e.printStackTrace(); if(!StringUtils.isNotBlank(data)){ return new Result("系統(tǒng)錯(cuò)誤!",false,HttpCode.STATUS_105); } } }
4.接口時(shí)效性+接口參數(shù)加密+不同來(lái)源的私鑰
4.1適合場(chǎng)景, 當(dāng)接口秘鑰被泄露時(shí),我們可以對(duì)不同的數(shù)據(jù)來(lái)源設(shè)置不同的私鑰,這樣即使接口秘鑰被泄露,沒(méi)有私鑰,依然不能對(duì)接口進(jìn)行操作,而且可以記錄是哪個(gè)項(xiàng)目的秘鑰被泄露,快速定位出問(wèn)題的來(lái)源,且不會(huì)影響其他項(xiàng)目調(diào)用。
@PostMapping("/syncInfo") public Result syncInfo(@RequestParam(name = "data")String data){ try { if(!StringUtils.isNotBlank(data)){ return new Result("失??!",false,HttpCode.STATUS_104); } DES des = new DES("基礎(chǔ)秘鑰".getBytes()); String j = des.decryptStr(data); logger.debug("解碼前:" + data); logger.debug("解碼后:" + j); InfoVo infoVo = JSONObject.parseObject(j,InfoVo.class); if(AddSecondes(infoVo.getTime(),20) < new Date().getTime()){ return new Result("接口失效!",false,HttpCode.STATUS_100); } String sign = getSignByFrom(Info.getFrom()); logger.debug("來(lái)源秘鑰"+sign); String k = des.decryptStr(Info.getData); dealInfo(k); return new Result("成功!",true, HttpCode.STATUS_200); }catch (Exception e){ e.printStackTrace(); if(!StringUtils.isNotBlank(data)){ return new Result("系統(tǒng)錯(cuò)誤!",false,HttpCode.STATUS_105); } } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/71188.html
摘要:本文將從以下幾個(gè)方面闡述架構(gòu)設(shè)計(jì)的一些經(jīng)驗(yàn)和思考。原文及討論請(qǐng)到通訊作為一種跨語(yǔ)言開(kāi)發(fā)模式,通訊層是架構(gòu)首先應(yīng)該考慮和設(shè)計(jì)的,往后所有的邏輯都是基于通訊層展開(kāi)。 關(guān)于Hybrid模式開(kāi)發(fā)app的好處,網(wǎng)絡(luò)上已有很多文章闡述了,這里不展開(kāi)。 本文將從以下幾個(gè)方面闡述Hybrid app架構(gòu)設(shè)計(jì)的一些經(jīng)驗(yàn)和思考。 原文及討論請(qǐng)到 github issue 通訊 作為一種跨語(yǔ)言開(kāi)發(fā)模式,通訊...
摘要:權(quán)限設(shè)計(jì)的雜談這篇文章的定位,不是宣傳某個(gè)框架,僅僅之是梳理一下有關(guān)權(quán)限方面的一些想法和最近項(xiàng)目中的一些探索過(guò)程。而這兩者的取舍則是有設(shè)計(jì)人員決定的。數(shù)據(jù)抽象原則最小特權(quán)劃分從某個(gè)程度上來(lái)說(shuō)決定了控制的對(duì)象,而數(shù)據(jù)抽象原則是是決定了操作。 權(quán)限設(shè)計(jì)的雜談 這篇文章的定位,不是宣傳某個(gè)框架,僅僅之是梳理一下有關(guān)權(quán)限方面的一些想法和最近項(xiàng)目中的一些探索過(guò)程。我們主要想解決一下問(wèn)題。 什么...
摘要:總結(jié)一下數(shù)據(jù)保護(hù)的技術(shù)點(diǎn)參數(shù)傳輸使用密文,可以使用對(duì)稱(chēng)加密非對(duì)稱(chēng)加密或者兩者的結(jié)合,比如請(qǐng)求就是屬于兩者結(jié)合的方式。安全性一些常用的安全問(wèn)題都要考慮到,并且在項(xiàng)目框架底層進(jìn)行防范,例如攻擊注入問(wèn)題單用戶(hù)或者單的訪問(wèn)頻率控制來(lái)進(jìn)行防攻擊。 App所有數(shù)據(jù)都來(lái)源于服務(wù)器,App和服務(wù)器交互普遍是采用http請(qǐng)求接口的方式,那么在搭建和維護(hù)一個(gè)后端Api項(xiàng)目時(shí)候需要注意哪些問(wèn)題呢? 1. 數(shù)...
摘要:接口測(cè)試主要用于檢測(cè)外部系統(tǒng)與系統(tǒng)之間以及內(nèi)部各個(gè)子系統(tǒng)之間的交互點(diǎn)。二接口測(cè)試用例設(shè)計(jì)接口測(cè)試的用例設(shè)計(jì)是關(guān)鍵,不能只是單純正常請(qǐng)求通過(guò)就算接口測(cè)試過(guò)了,要從業(yè)務(wù)功能性能等上去設(shè)計(jì)用例。 ...
摘要:本文會(huì)以引出問(wèn)題為主,后面有時(shí)間的話,筆者陸續(xù)會(huì)抽些重要的知識(shí)點(diǎn)進(jìn)行詳細(xì)的剖析與解答。敬請(qǐng)關(guān)注服務(wù)端思維微信公眾號(hào),獲取最新文章。 原文地址:梁桂釗的博客博客地址:http://blog.720ui.com 這里,筆者結(jié)合自己過(guò)往的面試經(jīng)驗(yàn),整理了一些核心的知識(shí)清單,幫助讀者更好地回顧與復(fù)習(xí) Java 服務(wù)端核心技術(shù)。本文會(huì)以引出問(wèn)題為主,后面有時(shí)間的話,筆者陸續(xù)會(huì)抽些重要的知識(shí)點(diǎn)進(jìn)...
閱讀 3751·2021-10-09 09:44
閱讀 3509·2021-09-22 15:29
閱讀 3296·2019-08-30 15:54
閱讀 3077·2019-08-29 16:19
閱讀 2224·2019-08-29 12:50
閱讀 648·2019-08-26 14:04
閱讀 1775·2019-08-23 18:39
閱讀 1403·2019-08-23 17:59