java - 用于安全 API 的加密请求参数
问题描述
我正在学习 android 并试图使我的应用程序尽可能安全。我已经购买了一个低于类的 android 应用程序
public class API {
@SerializedName("sign")
private String sign;
@SerializedName("salt")
private String salt;
@SerializedName("package_name")
private String package_name;
public API(Activity activity) {
String apiKey = "secretkey";
salt = "" + getRandomSalt();
sign = md5(apiKey + salt);
package_name = activity.getApplication().getPackageName();
}
public API(Context context) {
String apiKey = "secretkey";
salt = "" + getRandomSalt();
sign = md5(apiKey + salt);
package_name = context.getApplicationContext().getPackageName();
}
private int getRandomSalt() {
Random random = new Random();
return random.nextInt(900);
}
private String md5(String input) {
try {
// Create MD5 Hash
MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
digest.update(input.getBytes());
byte messageDigest[] = digest.digest();
// Create Hex String
StringBuilder hexString = new StringBuilder();
for (int i = 0; i < messageDigest.length; i++)
hexString.append(String.format("%02x", messageDigest[i]));
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
public static String toBase64(String input) {
byte[] encodeValue = Base64.encode(input.getBytes(), Base64.DEFAULT);
return new String(encodeValue);
}
}
它的使用如下
JsonObject jsObj = (JsonObject) new Gson().toJsonTree(new API(Login.this));
jsObj.addProperty("email", sendEmail);
jsObj.addProperty("password", sendPassword);
assert device != null;
jsObj.addProperty("player_id", device.getUserId());
jsObj.addProperty("method_name", "user_login");
ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
Call<LoginRP> call = apiService.getLogin(API.toBase64(jsObj.toString()));
我认为它通过 API 类加密来保护数据
我正在尝试在我的应用程序中使用上述方法,但我正在使用 RequestParams 所以我不知道如何在我的情况下使用上述方法
RequestParams requestParam=new RequestParams();
requestParam.put("mobile",mobile_number);
requestParam.put("password","password");
AsyncHttpClient client = new AsyncHttpClient();
client.get(BASE_URL+"login.php?",requestParams, new AsyncHttpResponseHandler() {
让我知道这里是否有人可以帮助我解决我的问题。
非常感谢!
解决方案
就保护数据而言,只要您使用 SSL/TLS(即使使用 GET),您的数据在传输过程中都会被加密。
话虽如此,上面的代码有 MD5 和 Base64 方法将信息转换为哈希。使用这些功能,您可以在您的应用程序和服务器之间共享一个密钥,并使用该密钥来加密/解密哈希值。
为了使 md5 函数更安全,您可以创建一个已知的“盐”值而不是随机值,然后像这样更新函数:
public static String md5(String salt, String plainText)
throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
if (salt != null) {
md.update(salt.getBytes());
}
md.update(plainText.getBytes());
byte byteData[] = md.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16)
.substring(1));
}
return sb.toString();
}
并像这样更新调用:
requestParam.put("password", md5(md5(SALT_VALUE), md5(password));
此外,作为旁注,使用 GSON,您不必构建自己的 JSON 对象,您可以使用实际的对象引用并调用.toJson()
推荐阅读
- maven - 我如何使用 kscript 编译 kotlin tornadofx?
- python - matplot lib和python中的条形图列表中的项目分组
- json - PostgreSQL,根据并行属性的值获取 JSON 对象字段
- c# - 使用数据库中数据的代理,如何将值转换为整数?
- excel - 在最后读取行时重新启动循环
- react-native - 通过 React Navigation 从任何组件访问导航道具
- python - 树莓派在 GPIO 处接收输入发送到另一个树莓派,后者在 GPIO 处提供输出
- c++ - 以编程方式防止文件被重命名或删除,但仍使其可写
- reactjs - 将道具传递给动态反应组件
- javascript - AngularJS:取消选择下拉菜单时隐藏div,并输出文本