『居善地』介面測試 — 11、介面簽名sign原理

繁華似錦Fighting發表於2021-06-14

1、什麼是加密以及解密?

  • 出於資訊保密的目的,在資訊傳輸或儲存中,採用密碼技術對需要保密的資訊進行處理。使得處理後的資訊不能被非受權者(含非法者)讀懂或解讀,這一過程稱為加密。
  • 在加密處理過程中,需要保密的資訊稱為“明文,經加密處理後的資訊稱為“密文”。加密即是將“明文”變為“密文”的過程。
  • 與此類似,將“密文”變為“明文”的過程被稱為解密。

2、加密方式的分類

(1)對稱加密

  • 對稱加密是最快速、最簡單的一種加密方式,加密(encryption)與解密(decryption)用的是同樣的金鑰(secret key)。
  • 對稱加密有很多種演算法,由於它效率很高,所以被廣泛使用在很多加密協議的核心當中。
  • 對稱加密通常使用的是相對較小的金鑰,一般小於256 bit。
    因為金鑰越大,加密越強,但加密與解密的過程越慢。
    如果你只用1 bit來做這個金鑰,那黑客們可以先試著用0來解密,不行的話就再用1解;
    但如果你的金鑰有1 MB大,黑客們可能永遠也無法破解,但加密和解密的過程要花費很長的時間。
    金鑰的大小既要照顧到安全性,也要照顧到效率,
  • 對稱加密的一大缺點是,金鑰的管理與分配。
    換句話說,如何把金鑰傳送到需要解密你的訊息的人的手裡是一個問題。
    在傳送金鑰的過程中,金鑰有很大的風險會被黑客們攔截。
    現實中通常的做法是將對稱加密的金鑰進行非對稱加密,然後傳送給需要它的人。
  • 常見的對稱加密演算法有DES3DESBlowfishRC4RC5RC6AES

(2)非對稱加密

  • 非對稱加密為資料的解加密與密提供了一個非常安全的方法,它使用了一對金鑰,公鑰(public key)和私鑰(private key)。
  • 私鑰只能由一方安全保管,不能外洩,而公鑰則可以發給任何請求它的人。
  • 非對稱加密使用這對金鑰中的一個進行加密,而解密則需要另一個金鑰。
    比如,你向銀行請求公鑰,銀行將公鑰發給你,你使用公鑰對訊息加密,那麼只有私鑰的持有人:銀行,才能對你的訊息解密。
    與對稱加密不同的是,銀行不需要將私鑰通過網路傳送出去,因此安全性大大提高。
  • 雖然非對稱加密很安全,但是和對稱加密比起來,它非常的慢。所以我們還是要用對稱加密來傳送訊息,但對稱加密所使用的金鑰我們可以通過非對稱加密的方式傳送出去。
  • 非對稱加密的典型應用是數字簽名。
  • 常見的非對稱加密演算法有:RSAECC(移動裝置用)、Diffie-HellmanEl GamalDSA(數字簽名用)。
    目前最常用的非對稱加密演算法是RSA演算法。

(3)總結:

對稱加密:

  • 定義:加密和解密使用的是同一個祕鑰,例如:AESMD5
  • 特點:加密和解密效率高,安全性低。

非對稱加密:

  • 定義:加密使用的是公鑰,解密使用私,例如:RSA
  • 特點:安全性高,加密解密效率低。

3、介面簽名sign原理

(1)什麼是介面簽名?

是使用使用者名稱密碼時間戳和所有的排過序之後的引數,拼接組合起來成為一個串,再把該串加密得到的字串,這就是一個簽名。

該簽名字串是唯一的有權訪問第三方介面的鑑權碼。

(2)為什麼需要做介面簽名

  1. 防偽裝攻擊。
  2. 防篡改攻擊。
  3. 防重放攻擊。
  4. 防資料洩露。

在為第三方系統提供介面的時候,肯定要考慮介面資料的安全問題,比如資料是否被篡改,資料是否已經過時,資料是否可以重複提交等問題。其中我認為最終要的還是資料是否被篡改。

(3)介面簽名的實踐方案

1)、明確請求身份

為開發者分配AccessKey(開發者標識,確保唯一)和SecretKey(用於介面加密,確保不易被窮舉,生成演算法不易被猜測)。

也有的人叫appidappsecret,針對不同的呼叫方分配不同的appidappsecret

(一般16-32位長,字母和數字組成,由開發提供。)

2)、生成signature(簽名)

  • 步驟1:對所有請求引數按key的ASCII碼做升序排列。
    例如:
    {"c":"3","b":"2","a":"1"}
    排序之後:
    {"a":"1","b":"2","c":"3"}
  • 步驟2:把請求引數拼接組合成串。
    把所有排好序的請求引數,使用URL鍵值對的格式,即key1=value1&key2=value2…的格式,拼接成字串,設位sign_temp。
  • 步驟3:把AccessKeySecretKey碼加入上面拼接好的字串。
    可以靈活新增,可以把兩個引數都加在字串sign_temp前面。
    也可以把兩個引數都加在字串sign_temp後面,或者一前一後。
    例如:AccessKey=admin&SecretKey=123456&a=1&b=2&c=3
    (這個規則都是開發定義好的。)
  • 步驟4:用時間戳連線到字串的尾部。
    例如:AccessKey=admin&SecretKey=123456&a=1&b=2&c=3&timestamp=3424234....
  • 步驟5:然後再把這個字串進行MD5加密,加密後再轉化成大寫。
    7CB6DFDCB3BAED652BF6A09D2ACDE34F
    這串字串就是signature(簽名)

說明:

  • 這裡使用了MD5的演算法進行簽名,也可以自行選擇其他簽名方式,例如RSA,SHA等。
  • 在請求中帶上時間戳,並且把時間戳也作為簽名的一部分,在介面提供方對時間戳進行驗證,只允許一定時間範圍內的請求,例如10分鐘。
    因為請求方和介面提供方的伺服器可能存在一定的時間誤差,建議時間戳誤差在5分鐘內比較合適。
    允許的時間誤差越大,連結的有效期就越長,請求唯一性的保證就越弱。所以需要在兩者之間衡量。

3)、介面的請求引數

已登陸介面為例:

請求引數:
{
	"username":"Jerry",
	"password":"Test123456",
	"signature":"7CB6DFDCB3BAED652BF6A09D2ACDE34F",
	"timestamp":"時間戳 " 
}

# 提示:
# signature和timestamp引數是提供實現介面加密,
# 但是不參與介面業務邏輯。

服務端收到請求的引數之後,介面會對signature進行解密和判斷,是否符合請求標準。

符合標準之後就處理請求返回結果。

4)、編寫測試用例

  1. 獲得AccessKeySecretKey碼。
  2. 通過演算法獲得signature(簽名)。
  3. 把簽名放入請求引數中。
  4. 剩餘步驟與測試普通介面相同。

總結:

我們只要瞭解介面簽名sign原理即可,關於實現程式碼,可以網上搜尋,然後結合自己業務需求進行編碼。

這裡就不展示實際程式碼了。

相關文章