1. 程式人生 > >資料與安全之身份鑑別

資料與安全之身份鑑別

一般來說APP提供的服務都是基於 HTTP 協議的,雲端對客戶端發過來的每一個請求,都進行了身份鑑別(Authentication)和訪問授權(Authorization)的嚴格檢查。

在封裝的SDK(對外輸出)中,為每一個應用準備了三個身份鑑別需要的標識:

  • appId:這是一個應用的全域性唯一標識,類似於我們個人的身份證號碼。
  • appKey:用於判斷來自該應用客戶端的請求是否合法的驗證序號。
  • masterKey:也是一種 appKey,只是使用它來進行請求的時候 ,雲端會忽視所有的訪問許可權控制(因為它擁有超級許可權,用它來發起操作,類似於在 Linux 系統中的 root 在進行操作。),因此禁止在客戶端或不信任的環境下使用,以免洩漏。

在使用 SDK 或者直接請求 REST API 的時候,都需要在 HTTP Header 中提供 appId 和 appKey 資訊:appId 用來標識是哪一個應用發起的請求,appKey 則用來對請求的合法性進行鑑權。

+

網路世界中總有一些別有用心的人存在,appId 和 appKey 在這裡是明文傳輸的,儘管我們做了很多努力,但還是難保不會洩漏。所以,為了避免這種風險,我們又採用了一種更安全的鑑權方式: 在 HTTP Header 中不再直接填寫 appKey,而用一個「簽名字串」代替。 簽名字串在客戶端計算,由 appKey(或者 masterKey) 加上請求發起時的時間(精確到毫秒

),再對它們進行 MD5 簽名之後得到的字串。雲端收到這樣的請求之後,根據 appId 可以找到內部儲存的 appKey,然後經過同樣的雜湊函式計算出簽名,比較後如果簽名不匹配或者請求已經超時,則認為是一個非法請求而直接丟棄,如果是一個合法請求,則再進入下面的訪問授權檢查流程。

+

如此一來,網路傳輸過程中,我們可以做到不再暴露任何 appKey 的資訊,但是對於原生的 iOS、Android 應用,或者 Web 站點來說,黑客還可以通過反編譯等手段,獲知到程式碼中在初始化 SDK 時設定的 appId 和 appKey。所以我們不能假設 appKey 不會洩漏,而應該使用下一節介紹的訪問控制列表來加強資料的安全性。