環境:後臺 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】解密獲得真實數據。
...
跨域配置配置: