安卓开发:如何将API签名加密逻辑适配到RequestParams请求场景
适配方案
你可以按照以下步骤直接将加密逻辑适配到RequestParams场景:
核心逻辑说明
原加密方案的核心流程是:
- 实例化API类自动生成随机salt、对应sign校验值、当前应用包名
- 把校验字段和业务参数合并为完整JSON
- 整体做Base64编码后传递给后端,后端解码后先校验sign合法性再解析业务参数
适配代码示例
首先确保你的项目已经引入Gson依赖(用于JSON序列化),没有的话在模块级build.gradle的dependencies中添加:
implementation 'com.google.code.gson:gson:2.10.1'
然后修改你的请求代码如下:
// 1. 实例化API类,传入当前Activity/Context生成校验参数 API api = new API(YourCurrentActivity.this); // 2. 转成JsonObject用于追加业务参数 JsonObject paramJson = (JsonObject) new Gson().toJsonTree(api); // 3. 添加你的业务请求参数 paramJson.addProperty("mobile", mobile_number); paramJson.addProperty("password", password); // 4. 整体JSON转Base64编码 String encodedParam = API.toBase64(paramJson.toString()); // 5. 构造RequestParams,参数名请和后端约定的接收字段保持一致,示例中为data RequestParams requestParams = new RequestParams(); requestParams.put("data", encodedParam); // 6. 发起请求 AsyncHttpClient client = new AsyncHttpClient(); client.get(BASE_URL + "login.php", requestParams, new AsyncHttpResponseHandler() { // 原有回调逻辑保持不变即可 @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { // 处理成功响应 } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { // 处理失败响应 } });
注意&优化建议
- 目前API类中的
apiKey硬编码在Java代码中,很容易被反编译提取,建议后续把密钥存储到NDK原生库,或者做字符串混淆提升破解成本。 - MD5是摘要算法仅用于防篡改,不能加密数据,敏感参数比如密码建议额外加一层AES对称加密再放入JSON。
- 当前随机salt仅为0-899的整数,范围太小容易被暴力碰撞生成合法sign,建议改成16位以上的随机字符串提升安全性。
- 如果用GET请求传递Base64参数,
+、/、=等特殊字符可能被URL转义导致后端解码失败,建议改成POST请求,或者把Base64编码的flag改为Base64.URL_SAFE | Base64.NO_WRAP,同时后端同步调整解码规则。
内容的提问来源于stack exchange,提问作者Nidhi
相关产品推荐
相关产品推荐

