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