httppost请求

vngu2lb8  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(284)

我使用截击请求服务器,我有这个网址,我张贴我的deviceid,制造商,android版本等,我得到了一个aeskey和aesiv base64编码和一个授权密钥,所以我把这个授权密钥作为标题发送到另一个网址,作为一个机构,我需要把“句点(它可以是='所有','增加',“递减”等),由aeskey和aesiv加密,aes256填充pkcs7和ecb或cbc。但是我从第一个请求得到响应,但是从第二个请求得到HTTP400错误,我不知道我做错了什么。我没有访问服务器的权限,所以对标题和参数我只是添加了我被告知要添加的内容。我在想也许我做的加密错了?
我就是这样解码base64 aeskey和aesiv的

key = response.getString("aesKey");
                    iv = response.getString("aesIV");
                    byte[] aeskey = Base64.decode(key, Base64.DEFAULT);
                    byte[] aesiv = Base64.decode(iv, Base64.DEFAULT);

这是我的第一个请求代码

public void getData(String url,String deviceID) throws JSONException {
        JSONObject datas = new JSONObject();
        datas.put("deviceID", deviceID);
        datas.put("systemVersion", Build.VERSION.SDK_INT);
        datas.put("platformName","Android");
        datas.put("deviceModel",Build.MODEL);
        datas.put("manifacturer",Build.MANUFACTURER);
        RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
        JsonObjectRequest req = new JsonObjectRequest(Request.Method.POST, url, datas, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                System.out.println(response);

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                System.out.println(error.toString());
            }
        }){

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {

                Map<String,String> params = new HashMap<>();
                params.put("Content-Type", "application/json");

                return params;
            }
        };

        queue.getCache().clear();
        queue.add(req);

    }

这是我的加密方法

public static byte[] encrypt(String plainText, byte[] key, byte[] iv) throws Exception
    {

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");

        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
        AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, paramSpec);

        byte[] cipherText = cipher.doFinal(plainText.getBytes());
        return cipherText;
    }

这是我第二次请求的第二种方法

public void getanotherdata(String url, String period, final String auth) throws JSONException {
        JSONObject datas1 = new JSONObject();
        datas1.put("period", period);
        RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
        JsonObjectRequest req = new JsonObjectRequest(Request.Method.POST, url, datas1, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {

                try {
                    System.out.println(response.toString());
                    System.out.println("burası çalıştı");
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println(e.toString());
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                System.out.println(error.toString());
            }
        }){

            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {

                Map<String,String> params = new HashMap<>();
                params.put("Content-Type", "application/json");
                params.put("X-VP-Authorization", auth);
                System.out.println("AUTH DEĞERİ "+ auth);

                return params;
            }
        };

        queue.getCache().clear();
        queue.add(req);
    }
pwuypxnk

pwuypxnk1#

我有两个可能的答案
您可能面临头本身的编码问题,要在rfc-2616中验证http标准,头字段名称必须是由1个或多个char=<任何us ascii字符(八位字节0-127)>组成的令牌
可能其中一个代理层(比如nginx或类似的)在请求到达服务器之前“吃掉”了请求的头。也许您应该在发出400的接收服务器上验证它是否正确地接收到包含身份验证信息的头。

相关问题