背景:
哈希碼參數校驗防參數篡改。前端下發接口時對參數按約定祕鑰和邏輯進行加密,後端在獲取到請求後對請求參數以同樣的祕鑰和邏輯加密計算得出哈希值,再與請求的哈希值對比,如果不一致則證明參數被篡改。
前端代碼:
對json對象進行了按key排序
1 let dataTmp = this.deepClone(data); 2 3 let dataStr:string 4 5 dataStr = JSON.stringify(dataTmp, Object.keys(dataTmp).sort()) 6 return CryptoJS.HmacSHA256(dataStr, key).toString(CryptoJS.enc.Hex)
python代碼:
1 import json 2 return json.dumps(datas)// 排序和加密代碼省略
錯誤結果原因:
對相同的參數進行計算前後端得出的結果不一致,經查閱相關資料(JSON.stringify和json.dumps源碼)得知,不一致原因是空格的不同導致。JSON.stringify默認(0)是沒有空格,而json.dumps默認(None)是1個空格,而且二者在設置空格數1時對第一個key之前的空格表現也不同。1時JSON.stringify第一個key前仍有空格('{\n "a": 1\n}'),而json.dumps沒有。經測試0.5時JSON.stringify可以去除第一個key前的空格('{\n"a": 1\n}')。因而設置空格數1以上時,前後端可以得到相同結果。
正確結果編碼:
前端:
1 let dataTmp = this.deepClone(data); 2 3 et dataStr:string 4 5 dataStr = JSON.stringify(dataTmp, Object.keys(dataTmp).sort(),4) 6 return CryptoJS.HmacSHA256(dataStr, key).toString(CryptoJS.enc.Hex)
python:
1 import json 2 return json.dumps(datas,indent=4)