Sign簽名存在目的:為了防止不法分子修改參數數據,進而攻擊服務器,導致數據泄露或從中獲得利益
例如:一個接口是用戶把積分轉帳給他的朋友,修改后,變為轉帳到攻擊者的帳戶,這樣,攻擊者就能得到利益啦
Sign執行流程:
客戶端:當客戶請求服務器前,會定義請求參數,通過這些參數,會生成一個Sign簽名,生成簽名之后,和參數一起放進請求頭里,傳給服務器;
服務器:接收到傳過來的請求數據,先通過傳來的參數,生成相應的Sign簽名,之后與客戶端傳來的Sign簽名進行一個比對(因為兩者的參數一致,調用的生成簽名函數一致,那么最后的Sign也會一致),
如果兩個Sign簽名一致。通過驗證允許訪問服務器數據,否則禁止訪問。
簽名的參數里面,需要包含 channel_secret !!
原因:
如果沒有加上channel_secret ,攻擊者只要知道 簽名生成函數 ,就可以不被服務器發現之下修改數據;
1. 因為 SDK是公開給 客戶端開發者下載的,所以簽名生成函數 很容易就能被攻擊者知道。
2. 如果一個安全措施里面,生成函數需要保密才能安全,在現代密碼學的理解來說,這個安全措施並不夠安全。
加上channel_secret 后,攻擊者不但要知道 簽名生成函數,還需要知道channel_secret,才能夠修改數據。這樣數據就安全了。
什么是channel_secret :
channel_secret 就是每個 channel 也擁有的一個 key,
一般在客戶端申請一個新的 channel 時,服務器新增 channel 后生成 channel_secret,沒有意外情況下(例如 開發者丟失了 channel_secret ),就只會生成一次並且沒有時間有效期,然后告訴客戶端;
而key 是 密碼學中 不能被公開、被攻擊者知道的東西。而只要key 不被知道,即使其他代碼被人知道,系統仍能安全;
以上
END