一种h5前端和服务端通信的安全方案
?
前后端H5防篡改、防重放、敏感信息加解密、防XSS攻擊方案
完整步驟如下:
1、?前端打開h5頁面時(shí),調(diào)用后端接口獲取后端服務(wù)器時(shí)間,并計(jì)算出后端服務(wù)器時(shí)間與APP時(shí)間偏差。調(diào)用后端接口獲取后端通訊密鑰(公鑰)。(APP調(diào)用后端就接口傳入的時(shí)間戳參數(shù)Timestamp= APP當(dāng)前時(shí)間+ 【后端服務(wù)器時(shí)間與APP時(shí)間偏差】)。
2、?前端生成一個(gè)AES密鑰,用通訊密鑰(公鑰)對(duì)其做RSA加密,獲得加密后的AES密鑰為ENCODE_KEY。
3、? 前端將所有業(yè)務(wù)參數(shù)組裝成json字符串,上傳參數(shù)名為FieldVals
4、? 前端將業(yè)務(wù)參數(shù)整體json串FieldVals以及其他公共參數(shù)按照參數(shù)名字進(jìn)行排序,以value:key的方式一個(gè)一個(gè)用“|”拼接起來,然后把拼接串前后用括號(hào)括起來,接著對(duì)其整體做sha1加密(其中sha1的加密密碼為AES密鑰明文),從而獲得數(shù)字簽名Signture。
偽代碼:Sha1((value1:key1|value2:key2|value3:key3))
5、?前端用AES密鑰對(duì)FieldVals做AES加密,Base64 encode, url encode得到EncodeFieldVals。(前端應(yīng)該支持根據(jù)URL配置或參數(shù)名字過濾兩種加密策略)
6、?ENCODE_KEY, FieldVals或EncodeFieldVals,Signture以及其他公共參數(shù)上傳到后端接口(post)。(注意有敏感信息的情況上傳EncodeFieldVals,無敏感信息的情況下上傳FieldVals, 兩者只上傳一個(gè))。
7、?后端用通訊密鑰(私鑰)對(duì)ENCODE_KEY 進(jìn)行RSA解密得到AES密鑰。
8、?如果前端有傳入EncodeFieldVals,后端對(duì)EncodeFieldVals進(jìn)行url decode, Base64decode,AES解密,得到FieldVals放入httpRequestWapper.
9、? 后端把接收到的所有參數(shù)按照參數(shù)名字進(jìn)行排序(Signture,EncodeFieldVals除外),以value:key的方式一個(gè)一個(gè)用“|”拼接起來,然后把拼接串前后用括號(hào)括起來,接著整體做sha1加密(其中sha1的加密密碼為AES密鑰明文),得到的值與Signture做比對(duì),如果不相等,說明被篡改直接返回前端。否則繼續(xù)下一步。
10、后端獲取公共參數(shù)Timestamp,拿服務(wù)器系統(tǒng)時(shí)間減去Timestamp,看是否超過5分鐘,如果超過說明請(qǐng)求已經(jīng)失效,直接返回前端,否則繼續(xù)下一步。
11、?后端獲取公共參數(shù)RequestId(由前端每次請(qǐng)求生成并且保證唯一),檢查服務(wù)器緩存中是否已經(jīng)存在此RequestId,如果已經(jīng)存在,證明是重放請(qǐng)求,直接返回前端,否則將此RequestId緩存起來,5分鐘失效,繼續(xù)下一步。
12、?后端將FieldVals按照規(guī)則分解成一個(gè)一個(gè)的參數(shù)放入httpRequestWapper。
13、?后端執(zhí)行業(yè)務(wù)處理邏輯。
14、?后端對(duì)業(yè)務(wù)處理返回的結(jié)果對(duì)象進(jìn)行遍歷,進(jìn)行XSS腳本過濾處理。
15、?后端獲取結(jié)果對(duì)象中的data部分,并轉(zhuǎn)換為json字符串,然后用AES密鑰進(jìn)行加密得到EncodeFieldVals,把EncodeFieldVals設(shè)置到結(jié)果對(duì)象中,同時(shí)清空data。(后端應(yīng)該支持根據(jù)URL配置或參數(shù)名字過濾兩種加密策略)
16、?后端返回前端結(jié)果對(duì)象。
17、?前端拿到結(jié)果對(duì)象,獲取EncodeFieldVals部分,用AES密鑰進(jìn)行解密,得到j(luò)son字符串,然后轉(zhuǎn)換成json數(shù)據(jù)對(duì)象,接下來做后續(xù)處理。
?
說明:
1、?ENCODE_KEY,登陸區(qū)外需要敏感信息加密的接口必傳,登陸區(qū)內(nèi)接口不需要傳,因?yàn)榈顷憰r(shí)已保存在會(huì)話中,登陸區(qū)內(nèi)可共享。
2、?敏感信息加解密、防重放,不是所有接口都做,可以通過配置對(duì)某些接口生效。
敏感信息加密支持對(duì)包含某些字段的報(bào)文進(jìn)行自動(dòng)加密。
前端負(fù)責(zé)對(duì)上送給后端的敏感信息進(jìn)行加密,對(duì)后端返回來的敏感信息進(jìn)行解密。
后端負(fù)責(zé)對(duì)前端上送的敏感信息進(jìn)行解密,對(duì)返回給前端的敏感信息進(jìn)行加密。
3、? 增加ClientType公共字段,傳值為H5? 用來區(qū)分native, h5, pc
4、? 公共參數(shù)設(shè)備號(hào)之類的
5、? 請(qǐng)參照native公共參數(shù)的傳遞方式,把公共參數(shù)放在URL之后傳遞。
FieldVals,EncodeFieldVals業(yè)務(wù)參數(shù)需要post過來。
?
?
總結(jié)
以上是生活随笔為你收集整理的一种h5前端和服务端通信的安全方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蚊子132 主要负责 FreeEIM 的
- 下一篇: drawable-(hdpi,mdpi,