一種h5前端和服務端通訊的安全方案
前後端H5防篡改、防重放、敏感資訊加解密、防XSS攻擊方案
完整步驟如下:
1、 前端開啟h5頁面時,呼叫後端介面獲取後端伺服器時間,並計算出後端伺服器時間與APP時間偏差。呼叫後端介面獲取後端通訊金鑰(公鑰)。(APP呼叫後端就介面傳入的時間戳引數Timestamp= APP當前時間+ 【後端伺服器時間與APP時間偏差】)。
2、 前端生成一個AES金鑰,用通訊金鑰(公鑰)對其做RSA加密,獲得加密後的AES金鑰為ENCODE_KEY。
3、 前端將所有業務引數組裝成json字串,上傳引數名為FieldVals
4、 前端將業務引數整體json串FieldVals以及其他公共引數按照引數名字進行排序,以
虛擬碼:Sha1((value1:key1|value2:key2|value3:key3))
5、 前端用AES金鑰對FieldVals做AES加密,Base64 encode, url encode得到EncodeFieldVals。(前端應該支援根據URL配置或引數名字過濾兩種加密策略)
6、 ENCODE_KEY, FieldVals或EncodeFieldVals,Signture以及其他公共引數上傳到後端介面(post)。(注意有敏感資訊的情況上傳EncodeFieldVals,無敏感資訊的情況下上傳FieldVals, 兩者只上傳一個)。
7、 後端用通訊金鑰(私鑰)對ENCODE_KEY 進行RSA解密得到AES金鑰。
8、 如果前端有傳入EncodeFieldVals,後端對EncodeFieldVals進行url decode, Base64decode,AES解密,得到FieldVals放入httpRequestWapper.
9、 後端把接收到的所有引數按照引數名字進行排序(Signture,EncodeFieldVals除外),以value:key的方式一個一個用“|”拼接起來,然後把拼接串前後用括號括起來,接著整體做sha1加密(其中sha1的加密密碼為AES金鑰明文),得到的值與Signture做比對,如果不相等,說明被篡改直接返回前端。否則繼續下一步。
10、後端獲取公共引數Timestamp,拿伺服器系統時間減去Timestamp,看是否超過5分鐘,如果超過說明請求已經失效,直接返回前端,否則繼續下一步。
11、 後端獲取公共引數RequestId(由前端每次請求生成並且保證唯一),檢查伺服器快取中是否已經存在此RequestId,如果已經存在,證明是重放請求,直接返回前端,否則將此RequestId快取起來,5分鐘失效,繼續下一步。
12、 後端將FieldVals按照規則分解成一個一個的引數放入httpRequestWapper。
13、 後端執行業務處理邏輯。
14、 後端對業務處理返回的結果物件進行遍歷,進行XSS指令碼過濾處理。
15、 後端獲取結果物件中的data部分,並轉換為json字串,然後用AES金鑰進行加密得到EncodeFieldVals,把EncodeFieldVals設定到結果物件中,同時清空data。(後端應該支援根據URL配置或引數名字過濾兩種加密策略)
16、 後端返回前端結果物件。
17、 前端拿到結果物件,獲取EncodeFieldVals部分,用AES金鑰進行解密,得到json字串,然後轉換成json資料物件,接下來做後續處理。
說明:
1、 ENCODE_KEY,登陸區外需要敏感資訊加密的介面必傳,登陸區內介面不需要傳,因為登陸時已儲存在會話中,登陸區內可共享。
2、 敏感資訊加解密、防重放,不是所有介面都做,可以通過配置對某些介面生效。
敏感資訊加密支援對包含某些欄位的報文進行自動加密。
前端負責對上送給後端的敏感資訊進行加密,對後端返回來的敏感資訊進行解密。
後端負責對前端上送的敏感資訊進行解密,對返回給前端的敏感資訊進行加密。
3、 增加ClientType公共欄位,傳值為H5 用來區分native, h5, pc
4、 公共引數見《F標準化介面_公共約定文件_V1.1.0_20161222.xlsx》
5、 請參照native公共引數的傳遞方式,把公共引數放在URL之後傳遞。
FieldVals,EncodeFieldVals業務引數需要post過來。