AK/SK簡單實戰

繼續 貼一篇以前工做中的經驗案例算法

                                                                             AK/SK簡單實戰

  項目中,平臺須要上下級級聯傳輸數據,發起請求時,須要進行安全認證,最終的認證方案 設計以下。                      json

1          基本概念安全

APP ID :用戶id, 會在網絡傳輸中出現,(由於域管設計的是http請求,因此容易暴露),用於識別用戶身份。每一個域管都有個全局惟一標識碼-indexCode,使用此標識做爲APP ID。服務器

 

APP key : 用戶的key, 能夠有多個,每一個key對應一組權限,邊緣域的API代理不需作權限細分,因此此處APP ID = APP key。網絡

 

APP Secret: 用戶的祕鑰,支持重置,要保證不容易被窮舉,生成算法不容易被猜到,禁止在網絡上傳輸,用戶須要妥善保存,防止被竊,不然有泄密風險。目前簡化設計,同一域管下全部用戶使用相同的key, 不一樣域管使用不一樣的key, key一旦被重置,以前的key就會失效。app

 

token : 在使用ak/sk 登錄認證經過後,返回token 給客戶端,token有有效期限制,有效期內直接使用token調用接口便可,當請求量很是大時,能有效下降服務器壓力。由於域管設計的是http請求,容易暴露token, 且目前請求量不大,因此這裏不用token。ui

 

 

2          上下級級聯配置編碼

APP ID = APP key=域管全局惟一標識碼-indexCode  是上級域管的固定值,一個隨機生成的32位uuid,生成後再也不改變。加密

APP Secret 須要由下級生成,拷貝配置到上級。下級若重置了secret, 上級須要從新配置,不然沒法訪問下級數據。url

 

3          通信協議

u  HTTP請求頭需指定Content-Type:application/json。

u  字符編碼:utf-8

u  HTTP請求參數(GET時放在querystring中,POST時放置在body 的json中)必選參數:

參數名

類型

描述

ts

long

進行接口調用時的時間戳,即當前時間戳 (時間戳:當前距離Epoch(1970年1月1日) 以秒計算的時間,即unix-timestamp),服務端會校驗時間戳,例如時間差超過20分鐘則認爲請求無效,防止重複請求的攻擊

nonce

long

隨機數,與ts相配合,以保證每次請求生成的簽名都不同

appid

string

域管全局惟一標識碼-indexCode,用於標識哪一個域管發來的請求

 

u  HTTP  請求頭必須加上Authorization字段,字段內容爲簽名(其中「Sign 」是 值):

 Authorization:Sign bhCQXTVyfj5cmA9uKkPFx1zeOXM=

 

²  簽名計算方法

 

GET請求POST請求::

待簽名串爲整個url參數:ts=1374908054&nonce=4587954&appid=xxxxx&param=xxxx

 

計算簽名:

使用HMAC-SHA256簽名算法,將app secret做爲算法的key,生成待簽名串的簽名。

將獲得的簽名BASE64編碼後設置到Authorization頭中(其中「Sign 」是 值):

             Authorization:Sign bhCQXTVyfj5cmA9uKkPFx1zeOXM=

 

4          簽名校驗

下級域(服務器)收到上級域(客戶端)的請求後,使用自身的app secret ,按上述簽名計算方法,計算出簽名, 與Authorization 中的簽名值比對,

相同則認爲請求合法,轉發請求並返回響應數據,不一樣則認爲非法,返回error

1.1.1.2       PD-022-002 域配置

實現下級域的添加、刪除、修改操做,全部下級域存儲在一張表中;

支持生成/重置本級域密鑰,密鑰加密存儲在db中。

祕鑰約定:32位隨機UUID,祕鑰一旦重置,以前的祕鑰將無效。

相關文章
相關標籤/搜索