最近前端與後端使用了RSA加密對請求Body進行了加密。前端使用JS、後端使用PHP。通過閱讀js和php代碼,大致瞭解他們使用加密過程。但我們jmeter壓力和自動化時需要使用java代碼實現。參考前端和後端的代碼,很快寫了一個RSA java的代碼。但是在java按他們拼接參數去請求時,響應報參數錯誤。通過抓包獲取到前端正常的請求RSA java代碼能正常解密,響應也能解密。
原來參數加密時使用encodeBase64String方法,而不是encodeBase64URLSafeString方法。查到這個原因折騰了一天。
一般不同語言實現RSA加解:重點關注對象,如果多端加解密對應不上,請修改此處,更多細節參考node-rsa文檔,另一個即是加密字符編碼導致。
public String publicEncrypt(String data) {
try {
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
//Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", PADDING);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return Base64.encodeBase64String(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), publicKey.getModulus().bitLength()));
//return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), publicKey.getModulus().bitLength()));
} catch (Exception e) {
throw new RuntimeException("加密字符串[" + data + "]時遇到異常", e);
}
}