成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

APP接口開發(fā)token安全之請求校驗規(guī)則

ZweiZhao / 2274人閱讀

摘要:移動應(yīng)用開發(fā)過程中請求服務(wù)端采用在計算機身份認證中是令牌臨時方式請求方式進行,請求方式下直接暴露在請求路徑很容易被別人利用進行篡改進行重復(fù)提交等,怎樣保證移動端安全成為后臺開發(fā)者所面臨的問題,因為涉及敏感行業(yè)數(shù)據(jù)接口開發(fā)過程中安全性成為要求

移動應(yīng)用開發(fā)過程中請求服務(wù)端采用token(在計算機身份認證中是令牌(臨時))方式請求方式進行,get請求方式下token直接暴露在請求路徑很容易被別人利用進行篡改進行重復(fù)提交等,怎樣保證移動端安全成為后臺開發(fā)者所面臨的問題,,因為涉及敏感行業(yè)數(shù)據(jù)APP接口開發(fā)過程中安全性成為要求,在網(wǎng)上看了很多資料最后選擇采用token+time+nonce+sign方式在過濾器層進行校驗,APP進行拼接加密,后端Filter進行解密校驗,優(yōu)點實現(xiàn)簡單,能夠很好保證請求過程中APP端到服務(wù)器端安全性,因此此種校驗方式被很多互聯(lián)網(wǎng)公司所采用。

一、技術(shù)實現(xiàn)原理:

token: token為用戶登錄時獲取的臨時令牌
time: APP獲取到的當(dāng)前時間,形式為long類型,time時間可進行匹配APP獲取時間和服務(wù)器時間差如果大于某個時間則失效(如鏈接超過60秒失效,具體可參考源碼),可防止別人截取數(shù)據(jù)后修改數(shù)據(jù)內(nèi)容進行提交
nonce:APP接口通過UUID等形式獲取的隨機不重復(fù)內(nèi)容,可以講nonce存放在session或redis中并設(shè)置合適的超時時間,然后下次請求時通過nonce取session或redis中是否存在,如果存在則認為重復(fù)提交請求,防止被別人篡改后提交數(shù)據(jù)
sign: 通過token+time+nonce三個參數(shù)加密后的密文(sign加密可使用使用ase,md5等加密方式,需要注意md5加密不可逆,實現(xiàn)過程有所區(qū)別),sign主要校驗token、time、nonce有沒有被別人篡改數(shù)據(jù)

二、技術(shù)實現(xiàn)過程:
     1在過濾層實現(xiàn)SecurityFilter類

 public class SecurityFilter extends Filter {

private static String secretKey = ApplicationConfig.secretKey;
private static String ivParameter = ApplicationConfig.ivParameter ;
// 本文采用ase加密 將加密secretKey及ivParameter 的保存在properties文件中,使用公共接口加載,用戶可以選擇其他加密方式

@Override
protected void doDestroy() {
    // TODO Auto-generated method stub

}

@Override
protected void doFilter(HttpServletRequest request,
        HttpServletResponse response, FilterChain chain) throws Throwable {
    String requestUri = request.getRequestURI();
    //登錄接口則直接不適用
    if(requestUri.indexOf("applogin")>-1){
          chain.doFilter(request, response);
    } else {
        MsgEntity msg = new MsgEntity();
        // 獲取request的URL,用于判斷該請求是否超時
        String time = request.getParameter("time");
        // 獲取請求nonce,用于判斷是否用戶重復(fù)提交
        String nonce = request.getParameter("nonce");
        // 獲取token碼,實際傳入token值
        String token = request.getParameter("token");
        // 獲取sign,通過time,nonce,token合并進行加密后密文,需要注意加密順序,平臺必須與APP一致
        String sign = request.getParameter("sign");
        // 判斷數(shù)據(jù)是否存在
        if (StringUtils.isEmpty(time) || StringUtils.isEmpty(nonce)
                || StringUtils.isEmpty(token) || StringUtils.isEmpty(sign)) {
            msg.setMsg("登錄失敗");
            msg.setState(false);
            HttpRequestUtils.writeResponseJsonString(response, msg);
            return;
        }
        //在實際開發(fā)過程中傳入數(shù)據(jù)發(fā)現(xiàn)存在%號無法進行解密,需要進行URLDecoder.decode進行解碼
        if (sign.indexOf("%") > -1) {
            sign = URLDecoder.decode(sign, "UTF-8");
        }
        // 判斷請求是否超過60秒,超過60秒則次請求鏈接失效,返回登錄失敗,可根據(jù)網(wǎng)絡(luò)情況適當(dāng)延長或者縮短時間
        if (difference(time) > 60) {
            msg.setMsg("登錄失敗");
            msg.setState(false);
            HttpRequestUtils.writeResponseJsonString(response, msg);
            return;
        }
        // 判斷是否是重復(fù)請求,如果請求nonce存在則登錄失敗,不存在則將nonce存在redis中或session中并設(shè)置合適超時時間
        if (JedisUtils.exists(nonce)) {
            msg.setState(false);
            msg.setMsg("登錄失敗");
            HttpRequestUtils.writeResponseJsonString(response, msg);
            return;
        } else {
            JedisUtils.set(nonce, "0", 70);
        }
         
        // aes 解密,sign和token + time + nonce進行比較判斷數(shù)據(jù)數(shù)據(jù)是否存在篡改
        String mingwei = "";
        try {
            mingwei = AesUtils.decrypt(sign);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if (!mingwei.equals(token + time + nonce)) {
            msg.setState(false);
            msg.setMsg("登錄失敗");
            HttpRequestUtils.writeResponseJsonString(response, msg);
            return;
        }
         //如果請求全部驗證通過則放行
        chain.doFilter(request, response);
    }
三、使用到的工具方法
//主要用于系統(tǒng)時間-APP發(fā)送數(shù)據(jù)時生成日期得到當(dāng)前差值(秒)
public int difference(String past) {
    long newTimestamp = new Date().getTime();
    return Math.abs((int) (newTimestamp - Long.parseLong(past)) / 1000);
}
   }
    
        /**
 * aes 解密
 * 
 * @param sSrc
 * @return
 * @throws Exception
 */
public static String decrypt(String sSrc) throws Exception {
    try {
        byte[] raw = secretKey.getBytes("ASCII");
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES / CBC / PKCS5Padding");
        IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
        byte[] encrypted1 = new BASE64Decoder().decodeBuffer(sSrc);// 先用base64解密
        byte[] original = cipher.doFinal(encrypted1);
        String originalString = new String(original, "UTF-8");
        return originalString;
    } catch (Exception ex) {
        return null;
    }
}

以上為過濾實現(xiàn)token校驗規(guī)則代碼,在開發(fā)過程中可以參考此代碼進行適當(dāng)修改進行使用

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/71068.html

相關(guān)文章

  • APP接口開發(fā)token安全請求校驗規(guī)則

    摘要:移動應(yīng)用開發(fā)過程中請求服務(wù)端采用在計算機身份認證中是令牌臨時方式請求方式進行,請求方式下直接暴露在請求路徑很容易被別人利用進行篡改進行重復(fù)提交等,怎樣保證移動端安全成為后臺開發(fā)者所面臨的問題,因為涉及敏感行業(yè)數(shù)據(jù)接口開發(fā)過程中安全性成為要求 移動應(yīng)用開發(fā)過程中請求服務(wù)端采用token(在計算機身份認證中是令牌(臨時))方式請求方式進行,get請求方式下token直接暴露在請求路徑很容易...

    nanfeiyan 評論0 收藏0
  • 數(shù)據(jù)接口(API)開發(fā)須知

    摘要:由服務(wù)端生成在請求任何接口之前,都必須先請求一個獲取服務(wù)器生成的的接口,獲取之后,才請求其他接口是請求時間型號設(shè)備號系統(tǒng)類型加密加密頭部存儲基本參數(shù)加密校驗參數(shù)必須填必須填以下為選填,可有可無,任由開發(fā)者自己定義類型設(shè)備號版本型號 傳統(tǒng)API與RESTful API 傳統(tǒng)API 獲取用戶信息 get /api/user/read 更新用戶信息 post /api/user/u...

    piglei 評論0 收藏0
  • 安全開發(fā)筆記

    摘要:登錄注冊安全風(fēng)險登錄注冊的風(fēng)險點主要有四個暴力破解撞庫遍歷注冊用戶批量注冊。引入了驗證碼機制同樣引入了額外的安全風(fēng)險,比如短信驗證碼的短信炸彈風(fēng)險圖形驗證碼的可繞過可識別等。 概述 很多技術(shù)研發(fā)不了解安全,也不重視安全,只有在自己的服務(wù)器被黑掉、被掛馬、被脫褲才想起關(guān)注安全,但是這個時候,技術(shù)架構(gòu)已經(jīng)成型、代碼已經(jīng)在線上穩(wěn)定運行,再亡羊補牢,改代碼、改策略,往往成本巨大、確收效很低。所...

    Cruise_Chan 評論0 收藏0
  • 支付開發(fā)填坑記支付寶

    摘要:原文地址支付支付步驟為獲取支付寶的配置信息。將得到的數(shù)據(jù)請求支付寶客戶端進行支付。端將拼接好的字符串拿去請求支付寶客戶端即可調(diào)起支付寶進行支付。向支付寶申請新訂單,獲取支付。成功請求回來后,就可以向支付寶發(fā)出一次支付請求。 支付寶在所有支付方式中最好開發(fā)的了,因為文檔比較清晰,而且開發(fā)起來也比較簡單。因此,支付寶的坑是相對較少的。原文地址 APP支付 APP支付步驟為: 獲取支付寶的...

    chanjarster 評論0 收藏0
  • 鵝廠干貨 | 騰訊游戲APP協(xié)議迭代的那些事

    摘要:本文則主要總結(jié)了心悅俱樂部的接入層從文本協(xié)議到二進制協(xié)議迭代過程中的技術(shù)方案,包括協(xié)議規(guī)范安全性等方面的內(nèi)容。在心悅的文本協(xié)議方案中,采用的是對請求數(shù)據(jù)進行模式的加密。包括明文的協(xié)議包頭和密文的二進制流。 歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實踐干貨哦~。 作者:羅廣鎮(zhèn) | 騰訊移動開發(fā)工程師 App與后臺通信通常有采用json等文本協(xié)議或者采用二進制協(xié)議,本文則主要總結(jié)了心...

    luck 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<