1. 程式人生 > >一種h5前端和服務端通訊的安全方案

一種h5前端和服務端通訊的安全方案

前後端H5防篡改、防重放、敏感資訊加解密、防XSS攻擊方案

完整步驟如下:

1、 前端開啟h5頁面時,呼叫後端介面獲取後端伺服器時間,並計算出後端伺服器時間與APP時間偏差。呼叫後端介面獲取後端通訊金鑰(公鑰)。(APP呼叫後端就介面傳入的時間戳引數Timestamp= APP當前時間+ 【後端伺服器時間與APP時間偏差】)。

2、 前端生成一個AES金鑰,用通訊金鑰(公鑰)對其做RSA加密,獲得加密後的AES金鑰為ENCODE_KEY。

3、  前端將所有業務引數組裝成json字串,上傳引數名為FieldVals

4、  前端將業務引數整體jsonFieldVals以及其他公共引數按照引數名字進行排序,以

value:key的方式一個一個用“|”拼接起來,然後把拼接串前後用括號括起來,接著對其整體做sha1加密(其中sha1的加密密碼為AES金鑰明文),從而獲得數字簽名Signture

虛擬碼: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過來。