一种h5前端和服务端通信的安全方案
?
前后端H5防篡改、防重放、敏感信息加解密、防XSS攻擊方案
完整步驟如下:
1、?前端打開h5頁面時,調用后端接口獲取后端服務器時間,并計算出后端服務器時間與APP時間偏差。調用后端接口獲取后端通訊密鑰(公鑰)。(APP調用后端就接口傳入的時間戳參數Timestamp= APP當前時間+ 【后端服務器時間與APP時間偏差】)。
2、?前端生成一個AES密鑰,用通訊密鑰(公鑰)對其做RSA加密,獲得加密后的AES密鑰為ENCODE_KEY。
3、? 前端將所有業務參數組裝成json字符串,上傳參數名為FieldVals
4、? 前端將業務參數整體json串FieldVals以及其他公共參數按照參數名字進行排序,以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、? 公共參數設備號之類的
5、? 請參照native公共參數的傳遞方式,把公共參數放在URL之后傳遞。
FieldVals,EncodeFieldVals業務參數需要post過來。
?
?
總結
以上是生活随笔為你收集整理的一种h5前端和服务端通信的安全方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蚊子132 主要负责 FreeEIM 的
- 下一篇: 手机火狐浏览器怎么设置电脑模式_手机浏览