目錄
1、什么是加密以及解密?
- 出於信息保密的目的,在信息傳輸或存儲中,采用密碼技術對需要保密的信息進行處理。使得處理后的信息不能被非受權者(含非法者)讀懂或解讀,這一過程稱為加密。
- 在加密處理過程中,需要保密的信息稱為“明文,經加密處理后的信息稱為“密文”。加密即是將“明文”變為“密文”的過程。
- 與此類似,將“密文”變為“明文”的過程被稱為解密。
2、加密方式的分類
(1)對稱加密
- 對稱加密是最快速、最簡單的一種加密方式,加密(
encryption)與解密(decryption)用的是同樣的密鑰(secret key)。 - 對稱加密有很多種算法,由於它效率很高,所以被廣泛使用在很多加密協議的核心當中。
- 對稱加密通常使用的是相對較小的密鑰,一般小於256 bit。
因為密鑰越大,加密越強,但加密與解密的過程越慢。
如果你只用1 bit來做這個密鑰,那黑客們可以先試着用0來解密,不行的話就再用1解;
但如果你的密鑰有1 MB大,黑客們可能永遠也無法破解,但加密和解密的過程要花費很長的時間。
密鑰的大小既要照顧到安全性,也要照顧到效率, - 對稱加密的一大缺點是,密鑰的管理與分配。
換句話說,如何把密鑰發送到需要解密你的消息的人的手里是一個問題。
在發送密鑰的過程中,密鑰有很大的風險會被黑客們攔截。
現實中通常的做法是將對稱加密的密鑰進行非對稱加密,然后傳送給需要它的人。 - 常見的對稱加密算法有
DES、3DES、Blowfish、RC4、RC5、RC6和AES。
(2)非對稱加密
- 非對稱加密為數據的解加密與密提供了一個非常安全的方法,它使用了一對密鑰,公鑰(
public key)和私鑰(private key)。 - 私鑰只能由一方安全保管,不能外泄,而公鑰則可以發給任何請求它的人。
- 非對稱加密使用這對密鑰中的一個進行加密,而解密則需要另一個密鑰。
比如,你向銀行請求公鑰,銀行將公鑰發給你,你使用公鑰對消息加密,那么只有私鑰的持有人:銀行,才能對你的消息解密。
與對稱加密不同的是,銀行不需要將私鑰通過網絡發送出去,因此安全性大大提高。 - 雖然非對稱加密很安全,但是和對稱加密比起來,它非常的慢。所以我們還是要用對稱加密來傳送消息,但對稱加密所使用的密鑰我們可以通過非對稱加密的方式發送出去。
- 非對稱加密的典型應用是數字簽名。
- 常見的非對稱加密算法有:
RSA、ECC(移動設備用)、Diffie-Hellman、El Gamal、DSA(數字簽名用)。
目前最常用的非對稱加密算法是RSA算法。
(3)總結:
對稱加密:
- 定義:加密和解密使用的是同一個秘鑰,例如:
AES,MD5。 - 特點:加密和解密效率高,安全性低。
非對稱加密:
- 定義:加密使用的是公鑰,解密使用私,例如:
RSA。 - 特點:安全性高,加密解密效率低。
3、接口簽名sign原理
(1)什么是接口簽名?
是使用用戶名,密碼,時間戳和所有的排過序之后的參數,拼接組合起來成為一個串,再把該串加密得到的字符串,這就是一個簽名。
該簽名字符串是唯一的有權訪問第三方接口的鑒權碼。
(2)為什么需要做接口簽名
- 防偽裝攻擊。
- 防篡改攻擊。
- 防重放攻擊。
- 防數據泄露。
在為第三方系統提供接口的時候,肯定要考慮接口數據的安全問題,比如數據是否被篡改,數據是否已經過時,數據是否可以重復提交等問題。其中我認為最終要的還是數據是否被篡改。
(3)接口簽名的實踐方案
1)、明確請求身份
為開發者分配AccessKey(開發者標識,確保唯一)和SecretKey(用於接口加密,確保不易被窮舉,生成算法不易被猜測)。
也有的人叫appid和appsecret,針對不同的調用方分配不同的appid和appsecret。
(一般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:把
AccessKey和SecretKey碼加入上面拼接好的字符串。
可以靈活添加,可以把兩個參數都加在字符串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×tamp=3424234.... - 步驟5:然后再把這個字符串進行MD5加密,加密后再轉化成大寫。
7CB6DFDCB3BAED652BF6A09D2ACDE34F
這串字符串就是signature(簽名)
說明:
- 這里使用了MD5的算法進行簽名,也可以自行選擇其他簽名方式,例如RSA,SHA等。
- 在請求中帶上時間戳,並且把時間戳也作為簽名的一部分,在接口提供方對時間戳進行驗證,只允許一定時間范圍內的請求,例如10分鍾。
因為請求方和接口提供方的服務器可能存在一定的時間誤差,建議時間戳誤差在5分鍾內比較合適。
允許的時間誤差越大,鏈接的有效期就越長,請求唯一性的保證就越弱。所以需要在兩者之間衡量。
3)、接口的請求參數
已登陸接口為例:
請求參數:
{
"username":"Jerry",
"password":"Test123456",
"signature":"7CB6DFDCB3BAED652BF6A09D2ACDE34F",
"timestamp":"時間戳 "
}
# 提示:
# signature和timestamp參數是提供實現接口加密,
# 但是不參與接口業務邏輯。
服務端收到請求的參數之后,接口會對signature進行解密和判斷,是否符合請求標准。
符合標准之后就處理請求返回結果。
4)、編寫測試用例
- 獲得
AccessKey和SecretKey碼。 - 通過算法獲得signature(簽名)。
- 把簽名放入請求參數中。
- 剩余步驟與測試普通接口相同。
總結:
我們只要了解接口簽名sign原理即可,關於實現代碼,可以網上搜索,然后結合自己業務需求進行編碼。
這里就不展示實際代碼了。
