<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è)計與實現(xiàn)

          共 3219字,需瀏覽 7分鐘

           ·

          2021-02-23 13:25


          來源: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證書,一般需要交費。

          簽名的設(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加密(可以加點鹽),全部大寫,生成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ù)安全的訪問。

          具體實現(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)系。

          簽名實現(xiàn)

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

          String?sign?=?request.getParameter("sign");
          ????????Enumeration?pNames?=??request.getParameterNames();
          ????????Map?params?=?new?HashMap();
          ????????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?params,?boolean?encode)
          ????????????throws?UnsupportedEncodingException?
          {
          ????????Set?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();
          ????}

          最近給大家找了,SpringBoot+Vue前后端管理?相關(guān)資源


          掃二維碼為,加我微信,回復(fù):SpringBoot+Vue前后端管理

          ?注意,一定不要亂回復(fù),對好暗號


          沒錯,不是機(jī)器人
          記得一定要等待,等待才有好東
          瀏覽 33
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(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>
                  国产伦精品色情 | 在线视频韩国一区 | 欧美搡B网 | 免费视频黄片 | 北条麻妃AV在线 |