<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          App 開放接口 api 安全:Token 簽名 sign 的設(shè)計與實(shí)現(xiàn)

          共 5835字,需瀏覽 12分鐘

           ·

          2021-08-01 10:04

          微信搜索逆鋒起筆關(guān)注后回復(fù)編程pdf
          領(lǐng)取編程大佬們所推薦的 23 種編程資料!
          作者:碼一個大饅頭
          鏈接:https://www.cnblogs.com/whcghost/p/5657594.html

          前言

          在app開放接口api的設(shè)計中,避免不了的就是安全性問題,因為大多數(shù)接口涉及到用戶的個人信息以及一些敏感的數(shù)據(jù),所以對這些 接口需要進(jìn)行身份的認(rèn)證,那么這就需要用戶提供一些信息,比如用戶名密碼等,但是為了安全起見讓用戶暴露的明文密碼次數(shù)越少越好,我們一般在web項目 中,大多數(shù)采用保存的session中,然后在存一份到cookie中,來保持用戶的回話有效性。

          但是在app提供的開放接口中,后端服務(wù)器在用戶登錄后 如何去驗證和維護(hù)用戶的登陸有效性呢,以下是參考項目中設(shè)計的解決方案,其原理和大多數(shù)開放接口安全驗證一樣,如淘寶的開放接口token驗證,微信開發(fā) 平臺token驗證都是同理。

          對于敏感的api接口,需使用https協(xié)議

          https是在http超文本傳輸協(xié)議加入SSL層,它在網(wǎng)絡(luò)間通信是加密的,所以需要加密證書。

          https協(xié)議需要ca證書,一般需要交費(fèi)。

          簽名的設(shè)計

          原理: 用戶登錄后向服務(wù)器提供用戶認(rèn)證信息(如賬戶和密碼),服務(wù)器認(rèn)證完后給客戶端返回一個Token令牌,用戶再次獲取信息時,帶上此令牌,如果令牌正取,則返回數(shù)據(jù)。對于獲取Token信息后,訪問用戶相關(guān)接口,客戶端請求的url需要帶上如下參數(shù):

          時間戳: timestamp

          Token令牌: token

          然后將所有用戶請求的參數(shù)按照字母排序(包括timestamp,token),然后更具M(jìn)D5加密(可以加點(diǎn)鹽),全部大寫,生成sign簽名,這就是 所說的url簽名算法。然后登陸后每次調(diào)用用戶信息時,帶上sign,timestamp,token參數(shù)。

          例如:原請求https://www.andy.cn/api/user/update/info.shtml?city=北京 (post和get都一樣,對所有參數(shù)排序加密)

          加上時間戳和token

          https://www.andy.cn/api/user/update/info.shtml?city=北京×tamp=12445323134&token=wefkfjdskfjewfjkjfdfnc

          然后更具url參數(shù)生成sign

          最終的請求如

          https://www.andy.cn /api/user/update/info.shtml?city=北京×tamp=12445323134& token=wefkfjdskfjewfjkjfdfnc&sign=FDK2434JKJFD334FDF2

          其最終的原理是減小明文的暴露次數(shù);保證數(shù)據(jù)安全的訪問。

          具體實(shí)現(xiàn)如下:

          1. api請求客戶端想服務(wù)器端一次發(fā)送用用戶認(rèn)證信息(用戶名和密碼),服務(wù)器端請求到改請求后,驗證用戶信息是否正確。

          如果正確:則返回一個唯一不重復(fù)的字符串(一般為UUID),然后在Redis(任意緩存服務(wù)器)中維護(hù)Token----Uid的用戶信息關(guān)系,以便其他api對token的校驗。

          如果錯誤:則返回錯誤碼。

          2.服務(wù)器設(shè)計一個url請求攔截規(guī)則

          (1)判斷是否包含timestamp,token,sign參數(shù),如果不含有返回錯誤碼。

          (2)判斷服務(wù)器接到請求的時間和參數(shù)中的時間戳是否相差很長一段時間(時間自定義如半個小時),如果超過則說明該 url已經(jīng)過期(如果url被盜,他改變了時間戳,但是會導(dǎo)致sign簽名不相等)。

          (3)判斷token是否有效,根據(jù)請求過來的token,查詢redis緩存中的uid,如果獲取不到這說明該token已過期。

          (4)根據(jù)用戶請求的url參數(shù),服務(wù)器端按照同樣的規(guī)則生成sign簽名,對比簽名看是否相等,相等則放行。(自然url簽名 也無法100%保證其安全,也可以通過公鑰AES對數(shù)據(jù)和url加密,但這樣如果無法確保公鑰丟失,所以簽名只是很大程 度上保證安全)。

          (5)此url攔截只需對獲取身份認(rèn)證的url放行(如登陸url),剩余所有的url都需攔截。

          3.Token和Uid關(guān)系維護(hù)

          對于用戶登錄我們需要創(chuàng)建token--uid的關(guān)系,用戶退出時需要需刪除token--uid的關(guān)系。

          簽名實(shí)現(xiàn)

          獲取全部請求參數(shù)

          String sign = request.getParameter("sign");
                  Enumeration<?> pNames =  request.getParameterNames();
                  Map<String, Object> params = new HashMap<String, Object>();
                  while (pNames.hasMoreElements()) {
                      String pName = (String) pNames.nextElement();
                      if("sign".equals(pName))continue;
                      Object pValue = request.getParameter(pName);
                      params.put(pName, pValue);
                  }

          生成簽名

          public static String createSign(Map<String, String> params, boolean encode)
                      throws UnsupportedEncodingException 
          {
                  Set<String> keysSet = params.keySet();
                  Object[] keys = keysSet.toArray();
                  Arrays.sort(keys);
                  StringBuffer temp = new StringBuffer();
                  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);
                      }
                      if (encode) {
                          temp.append(URLEncoder.encode(valueString, "UTF-8"));
                      } else {
                          temp.append(valueString);
                      }
                  }

                  return MD5Utils.getMD5(temp.toString()).toUpperCase();
              }


          逆鋒起筆是一個專注于程序員圈子的技術(shù)平臺,你可以收獲最新技術(shù)動態(tài)最新內(nèi)測資格BAT等大廠大佬的經(jīng)驗增長自身學(xué)習(xí)資料職業(yè)路線賺錢思維,微信搜索逆鋒起筆關(guān)注!

          實(shí)戰(zhàn):利用 Python 開發(fā) App

          未來,一個 APP 就知道你的全部!

          螞蟻呀嘿 App,七天就下架了!

          一個人竟然擼了一個微博 App

          流氓 APP 依然在侵害用戶權(quán)益

          瀏覽 44
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费直接观看黄色网页 | 无码日韩电影 | 一级一片内射 | 久久久免费三级片网站 | 午夜视频一区二区 |