繼續 貼一篇以前工做中的經驗案例算法
項目中,平臺須要上下級級聯傳輸數據,發起請求時,須要進行安全認證,最終的認證方案 設計以下。 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¶m=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,祕鑰一旦重置,以前的祕鑰將無效。