哈嘍大家好,好久沒更新部落格了,今天我們來談談開放性api介面的資料安全問題。
app 客戶端請求後臺服務這樣的開發模式都是很常見的,這樣就導致了我們後臺的服務介面暴露在外網,任何人都可以來請求訪問,甚至很多不懷好意的人會通過這些介面竊取一些資訊來做一些違法的事情。如果有一個介面是獲取使用者資訊的,但是這個介面沒有任何驗證機制和機密措施,別人就可以隨便呼叫該介面獲取使用者資訊,甚至可以模擬引數獲取其他使用者的資訊。所有今天我們來說說怎麼能夠把開放性介面做的更安全一點。
方案一
一、步驟
- 1、我們可以學習微信,阿里雲,騰訊等這些大公司的一些做法,給每個客戶端分配一個appid和一個secret金鑰。
- 2、然後在發起請求之前,把請求引數按照字母的先後順序排序後得到一個:key=value,key1=value1的字串。例如:http://www.baidu.com?b=1&d=9&a=2 ,把引數排序後的順序為a=2,b=1,d=9。然後將這些引數按照一定的規則拼接成一個字串,如a2b1d9。
- 3、把secret拼接到引數字串的頭部或尾部進行MD5加密,得到的加密字串就是sign簽名,可以放到請求連結上傳送到後端進行驗證。
- 4、請求連結就變為http://www.baidu.com?b=1&d=9&a=2&appid=appid&sign=sign簽名 。注意:secret千萬不要暴露在請求連結上,不然被劫持後如果對方猜出你的拼接規則和加密方式,就能夠破解你連結上的簽名了。
- 5、後臺服務接受到請求後通過appid去獲取到對應的secret值,然後跟客戶端一樣的規則生成簽名,把這個簽名和客戶端傳送過來的進行對比,如果是一樣那就證明是合法的請求。
二、效果
通過加入一個secret和一個sign簽名,一下子解決掉了身份驗證和防止請求引數被篡改的問題,如果請求被攔截修改引數後該請求就會變成非法請求。如果偽造appid,後端無法通過無效appid獲取secret,該請求也無法通過驗證。
三、不足
如果被第三方獲取到了完整的請求連結,一直使用合法的appid和sign簽名發起請求,也是能夠正常獲取到資料的。
方案二
一、改進
在方案一的基礎上我們加入一個引數,發起請求時的時間戳。只有我們把這個時間戳也加入到sign演算法中進行加密,然後再請求連結上也加上這個時間戳,後端就能夠通過這個時間戳進行判斷,用當前時間的時間戳減去傳過來的時間戳,如果大於一個值也拒絕這個請求。如果別人獲取到這個連結也只能再這段時間內能請求,超時後就不能請求了。
謝謝觀看!
streetlamp 敬上!
本作品採用《CC 協議》,轉載必須註明作者和本文連結