<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>

          開(kāi)放API接口簽名驗(yàn)證,讓你的接口從此不再裸奔

          共 2819字,需瀏覽 6分鐘

           ·

          2021-08-03 19:54

          相關(guān)閱讀

          300本計(jì)算機(jī)編程的經(jīng)典書(shū)籍下載

          AI全套:Python3+TensorFlow打造人臉識(shí)別智能小程序

          最新人工智能資料-Google工程師親授 Tensorflow-入門(mén)到進(jìn)階

          Java架構(gòu)全階段七期完整

          黑馬頭條項(xiàng)目 - Java Springboot2.0(視頻、資料、代碼和講義)14天完整版

          Spring核心編程思想

          作者:Joker_Coding
          鏈接:https://www.jianshu.com/p/ad410836587a

          接口安全問(wèn)題

          • 請(qǐng)求身份是否合法?

          • 請(qǐng)求參數(shù)是否被篡改?

          • 請(qǐng)求是否唯一?

          AccessKey&SecretKey (開(kāi)放平臺(tái))

          請(qǐng)求身份

          為開(kāi)發(fā)者分配AccessKey(開(kāi)發(fā)者標(biāo)識(shí),確保唯一)和SecretKey(用于接口加密,確保不易被窮舉,生成算法不易被猜測(cè))。

          防止篡改

          參數(shù)簽名

          1. 按照請(qǐng)求參數(shù)名的字母升序排列非空請(qǐng)求參數(shù)(包含AccessKey),使用URL鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字符串stringA;

          2. 在stringA最后拼接上Secretkey得到字符串stringSignTemp;

          3. 對(duì)stringSignTemp進(jìn)行MD5運(yùn)算,并將得到的字符串所有字符轉(zhuǎn)換為大寫(xiě),得到sign值。

          請(qǐng)求攜帶參數(shù)AccessKeySign,只有擁有合法的身份AccessKey和正確的簽名Sign才能放行。這樣就解決了身份驗(yàn)證和參數(shù)篡改問(wèn)題,即使請(qǐng)求參數(shù)被劫持,由于獲取不到SecretKey(僅作本地加密使用,不參與網(wǎng)絡(luò)傳輸),無(wú)法偽造合法的請(qǐng)求。

          重放攻擊

          雖然解決了請(qǐng)求參數(shù)被篡改的隱患,但是還存在著重復(fù)使用請(qǐng)求參數(shù)偽造二次請(qǐng)求的隱患。

          timestamp+nonce方案

          nonce指唯一的隨機(jī)字符串,用來(lái)標(biāo)識(shí)每個(gè)被簽名的請(qǐng)求。通過(guò)為每個(gè)請(qǐng)求提供一個(gè)唯一的標(biāo)識(shí)符,服務(wù)器能夠防止請(qǐng)求被多次使用(記錄所有用過(guò)的nonce以阻止它們被二次使用)。

          然而,對(duì)服務(wù)器來(lái)說(shuō)永久存儲(chǔ)所有接收到的nonce的代價(jià)是非常大的??梢允褂?strong style="max-width: 100%;font-size: inherit;color: inherit;line-height: inherit;box-sizing: border-box !important;overflow-wrap: break-word !important;">timestamp來(lái)優(yōu)化nonce的存儲(chǔ)。

          假設(shè)允許客戶(hù)端和服務(wù)端最多能存在15分鐘的時(shí)間差,同時(shí)追蹤記錄在服務(wù)端的nonce集合。當(dāng)有新的請(qǐng)求進(jìn)入時(shí),首先檢查攜帶的timestamp是否在15分鐘內(nèi),如超出時(shí)間范圍,則拒絕,然后查詢(xún)攜帶的nonce,如存在已有集合,則拒絕。否則,記錄該nonce,并刪除集合內(nèi)時(shí)間戳大于15分鐘的nonce(可以使用redis的expire,新增nonce的同時(shí)設(shè)置它的超時(shí)失效時(shí)間為15分鐘)。

          實(shí)現(xiàn)

          請(qǐng)求接口:http://api.test.com/test?name=hello&home=world&work=java


          • 客戶(hù)端

            1. 生成當(dāng)前時(shí)間戳timestamp=now和唯一隨機(jī)字符串nonce=random

            2. 按照請(qǐng)求參數(shù)名的字母升序排列非空請(qǐng)求參數(shù)(包含AccessKey)
              stringA="AccessKey=access&amp;home=world&amp;name=hello&amp;work=java&amp;timestamp=now&amp;nonce=random";

            3. 拼接密鑰SecretKey
              stringSignTemp="AccessKey=access&amp;home=world&amp;name=hello&amp;work=java&amp;timestamp=now&amp;nonce=random&amp;SecretKey=secret";

            4. MD5并轉(zhuǎn)換為大寫(xiě)
              sign=MD5(stringSignTemp).toUpperCase();

            5. 最終請(qǐng)求
              http://api.test.com/test?name=hello&amp;home=world&amp;work=java&amp;timestamp=now&amp;nonce=nonce&amp;sign=sign;

          • 服務(wù)端

          Token&AppKey(APP)

          在APP開(kāi)放API接口的設(shè)計(jì)中,由于大多數(shù)接口涉及到用戶(hù)的個(gè)人信息以及產(chǎn)品的敏感數(shù)據(jù),所以要對(duì)這些接口進(jìn)行身份驗(yàn)證,為了安全起見(jiàn)讓用戶(hù)暴露的明文密碼次數(shù)越少越好,然而客戶(hù)端與服務(wù)器的交互在請(qǐng)求之間是無(wú)狀態(tài)的,也就是說(shuō),當(dāng)涉及到用戶(hù)狀態(tài)時(shí),每次請(qǐng)求都要帶上身份驗(yàn)證信息。

          Token身份驗(yàn)證

          1. 用戶(hù)登錄向服務(wù)器提供認(rèn)證信息(如賬號(hào)和密碼),服務(wù)器驗(yàn)證成功后返回Token給客戶(hù)端;

          2. 客戶(hù)端將Token保存在本地,后續(xù)發(fā)起請(qǐng)求時(shí),攜帶此Token;

          3. 服務(wù)器檢查T(mén)oken的有效性,有效則放行,無(wú)效(Token錯(cuò)誤或過(guò)期)則拒絕。

          安全隱患:Token被劫持,偽造請(qǐng)求和篡改參數(shù)。

          Token+AppKey簽名驗(yàn)證

          與上面開(kāi)發(fā)平臺(tái)的驗(yàn)證方式類(lèi)似,為客戶(hù)端分配AppKey(密鑰,用于接口加密,不參與傳輸),將AppKey和所有請(qǐng)求參數(shù)組合成源串,根據(jù)簽名算法生成簽名值,發(fā)送請(qǐng)求時(shí)將簽名值一起發(fā)送給服務(wù)器驗(yàn)證。這樣,即使Token被劫持,對(duì)方不知道AppKey和簽名算法,就無(wú)法偽造請(qǐng)求和篡改參數(shù)。再結(jié)合上述的重發(fā)攻擊解決方案,即使請(qǐng)求參數(shù)被劫持也無(wú)法偽造二次重復(fù)請(qǐng)求。

          實(shí)現(xiàn)

          登陸和登出請(qǐng)求
          后續(xù)請(qǐng)求
          • 客戶(hù)端
            和上述開(kāi)放平臺(tái)的客戶(hù)端行為類(lèi)似,把AccessKey改為token即可。

          • 服務(wù)端


          看完本文有收獲?請(qǐng)轉(zhuǎn)發(fā)分享給更多人


          往期資源:


          Flutter 移動(dòng)應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn) 視頻(開(kāi)發(fā)你自己的抖音APP)
          Java面試進(jìn)階訓(xùn)練營(yíng) 第2季(分布式篇)
          Java高級(jí) - 分布式系統(tǒng)開(kāi)發(fā)技術(shù)視頻


          瀏覽 89
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  国产精品98 | 无码在线免费播放 | 久久免费91| 欧美日韩高清免费观看一区二区三区四区 | 亚洲第6页 |