1. 程式人生 > >query參數的RAS加密

query參數的RAS加密

get seam 安全 encoder word 解析 而不是 通過 不包含

問題

接口測試中遇到參數需要加密的情況,如登錄、修改密碼。

現有2個接口:

  • 登錄接口,Post接口,password加密,參數類型body;
  • 修改密碼接口,Get接口,orderPassword、newPassword加密,參數類型query;

以上參數都使用RAS進行加密。

在請求過程中發現以下問題:

  1. 通過接口請求,後端可解密登錄接口的password,而修改密碼接口參數解密失敗。
  2. 在後端代碼中直接調用解密方法,可解密修改密碼接口參數。

原因

為何修改密碼接口參數解密失敗?

修改密碼接口的參數類型是query

現有加密方法中是使用Base64.getEncoder()進行加密

byte
[] byteContent =Base64.getEncoder().encode(bytes);

處理後的加密串是如下形式:

FuQpqfj51QVMMI/QTPe5FWgOKam+QZYcOvkiWR/QOwhUl6Yux8zYXaRmG8XX2tYVEdqIzlhnsPAoA4BarC54oiefwk9DDdZEVplctDloJY1VsiCmxhTvuPs/gBuP2DiodSLU7IcaEabAGSeIOhVO1DeQMMs7nQYTTn/2NslD6zA=

可以看到加密串中包含有/、+,在URL中這些特殊字符會被重新解析,而不是原文傳輸到後端,所以導致後端在解密通過Base64.getEncoder()加密過的query參數失敗。

為何登錄接口參數解密成功?

登錄接口的參數類型是body,傳輸Json數據,以application/json方式進行編碼,不會出現加密串在傳輸過程中被重新解析的問題。

解決方案

使用Base64.getUrlEncoder()(URL 和文件名安全型 base64 編碼方案)對query參數進行加密

byte[] byteContent =Base64.getUrlEncoder().encode(bytes);

處理後的加密串是如下形式:

QfCQV2V0MyAS2G8Ja4HNnlpQvv6XZxObRGL3mD2XvB6l2nE8Vb3By_zicKneFiF8Rn5ZDjzPk6AB_4qDMzrbe2ez6cCkR8z_CPCKwt2IGVUnCQtaYdBVFAAkHzgR9L8TS1q--bFAmWLc-exSEAm5moWWH-fCoHYmMP0I4YHG1rA=

加密串中不包含/、+,將加密後的query參數拼接在URL後請求接口,後端成功解密,修改密碼成功。

技術分享圖片

結論

  • 對於URL中的RAS加密參數需要使用Base64.getUrlEncoder()進行加密;
  • URL中的參數包含中文等特殊字符也可以使用Base64.getUrlEncoder()處理後再進行傳輸。

query參數的RAS加密