『居善地』接口測試 — 11、接口簽名sign原理


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原理即可,關於實現代碼,可以網上搜索,然后結合自己業務需求進行編碼。

這里就不展示實際代碼了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM