query引數的RAS加密
阿新 • • 發佈:2019-01-06
問題
介面測試中遇到引數需要加密的情況,如登入、修改密碼。
現有2個介面:
- 登入介面,Post介面,password加密,引數型別body;
- 修改密碼介面,Get介面,orderPassword、newPassword加密,引數型別query;
以上引數都使用RAS進行加密。
在請求過程中發現以下問題:
- 通過介面請求,後端可解密登入介面的password,而修改密碼介面引數解密失敗。
- 在後端程式碼中直接呼叫解密方法,可解密修改密碼介面引數。
原因
為何修改密碼介面引數解密失敗?
修改密碼介面的引數型別是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()處理後再進行傳輸。