首页 > 解决方案 > 用于安全 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() {

让我知道这里是否有人可以帮助我解决我的问题。

非常感谢!

标签: javaandroid

解决方案


就保护数据而言,只要您使用 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()


推荐阅读