web api 安全設計(1)

環境:後臺 ASP.NET Web API ,前端爲 html,js(跨域訪問)html

 


 

場景1:前端

客戶端自保管RSA 公鑰和密鑰,簽名爲客戶端私鑰簽名,服務端用客戶端公鑰進行簽名驗證跨域

 

場景2:安全

客戶端使用SHA1簽名(包含 AES_KEY)服務器

 


 保證了數據傳輸過程當中,數據的絕對安全性,就算被黑客抓包獲取他也機關用盡。加密

 

設計邏輯:spa

1. 從服務端獲取 【服務端 RSA 公鑰】設計

//客戶端判斷公鑰是否受信任
//todo...3d

 

2. 用戶登錄htm

  -- 隨機生成【本地 AES_KEY 臨時】

  -- 用【服務端 RSA 公鑰】加密敏感數據(【用戶密碼】、【本地 AES KEY 臨時】)

  -- 將登錄信息傳送給服務端

 

登錄參數:

"user_id": user_id,
"encrypted_password": encrypted_password, -- 使用服務端RSA公鑰加密的數據,包含:用戶密碼、登錄時間戳、隨機數
"encrypted_key": encrypted_key      -- 使用服務端RSA公鑰加密的數據,包含:【本地 AES_KEY 臨時】、登錄時間戳、隨機數

 

說明:

因爲用服務端RSA公鑰加密,只有服務端的RSA私鑰才能解密,

密碼部分和本地隨機的【本地 AES_KEY 臨時】加密時進行了隨機混淆,

而且服務端後臺進行了時間戳檢查(5分鐘有效),這樣就保證了登錄時的安全性。

 

登錄返回值:

token = obj.token; -- token

timestamp = obj.timestamp; -- 時間戳 用於客戶端與服務端進行同步計數器,防止重放攻擊

local_aes_key = AES_Decrypt(obj.aes_key, local_aes_key_first, local_aes_iv);  -- 用客戶端【本地 AES_KEY 臨時】解密數據獲得服務器生成給客戶端的【本地 AES_KEY】,用於後期簽名參數數據加解密

enabled_data_encryption = obj.enabled_data_encryption; -- 是否啓用數據加解密

 

 

 

 

 

 

 3. 接口調用

接口參數:

"token": token, 
"signature": signature, -- 簽名
"timestamp": timestamp,
"nonce": nonce,
"method_name": method_name, -- 方法名(control_name+action_name)
"raw": raw2 -- 方法的參數

 

簽名:

若是是場景1,簽名數據爲 token + "_" + timestamp + "_" + nonce + "_" + method_name + "_" + raw

客戶端用本身的RSA私鑰簽名,服務端用客戶端的公鑰進行簽名驗證

 

若是是場景2,簽名數據爲 local_aes_key + "_" + token + "_" + timestamp + "_" + nonce + "_" + method_name + "_" + raw

(local_aes_key 只有服務端和客戶端擁有,第三方無從得知,故其爲關鍵因素)

 

 

 

 

 

 

返回數據:

因爲配置爲加密傳輸數據(接口方法參數、返回數據),故返回爲 AES 加密數據的 HexStr,

須要客戶端親自使用【本地 AES KEY】解密獲得真實數據。

 

 

 

 


 

 

 

 ...

 

 

 

 


 

跨域配置配置:

相關文章
相關標籤/搜索