Android Okhttp 차단기의 암호화 요청체(DES 암호화 해독)

11555 단어 차단기okhttpandroid
최근 회사에서 프로젝트 보안을 위해https의 모든 인터페이스를 사용했습니다. DES 암호화 RequestBody의value 값을 사용합니다.
이게 쉽잖아. 차단기에서 올릴 데이터를 직접 얻어서 암호화하고 재할당하는 게 쉽잖아.어이가 없어서 그냥 내 얼굴을 때렸어.
쓸데없는 소리 하지 말고 이 구덩이들을 다시 한 번 복습해 보겠습니다.
첫 번째 단계는 네트워크 요청 클래스에 차단기를 추가합니다
차단기에서 업로드된 데이터를 조작합니다
post 요청이라면 Request를 꺼내십시오.body(); encodedValue 암호화를 반복해서 꺼낸 다음addEncoded를 추가합니다. URLdecode의 디코딩에 주의하십시오.
get 요청이라면 리퀘스트를 먼저 받으십시오.url () 그리고 이 url에 요청 파라미터가 포함되지 않은 url을 보십시오.encodedQuery () 이것이 비어 있지 않으면 다음 문자열 캡처 -> 암호화 수정 -> 다시 연결하기
네트워크 요청을 수행합니다.
그리고 복호화 ---->
백엔드와 상의한 후 백엔드에서 되돌아오는 데이터는 '데이터' 필드의value만 암호화했습니다. 그럼 '데이터' 만 복호화하면 됩니다.
response를 가져와서 되돌아오는 json에 대한 분석을 진행합니다. 백엔드에서 '데이터' 를 암호화하기 때문에 데이터는string 형식의 해석 복호화입니다. 복호화된 데이터를 json에 어떻게 다시 설치합니까?
복호화된 데이터는 스트링 타입인데 원래 표현하고자 했던'데이터'는 어떤 타입일까요? 어떤 타입인지 실체류에 어떻게 정확하게 설치해야 할지 모르겠어요.
나는 이'데이터'에 갇혀서 json열을 어떻게 직접 조작해야 할지 계속 생각하고 있다. 이것은 절묘한 방법이 아니라는 것을 알지만 내 뇌 용량이 크지 않아서 내가 해결할 수 있는 방법이 이미 훌륭하다고 생각한다substring(0,1).어쨌든 돌아온 제이슨은 몇 가지야.
그러면 되잖아요. 두 종류를 통칭해서 json Array와 json Object를 이렇게 해서 저는 드디어 완전한 생각을 하게 됐어요.
보시면 여러분도 인내심의 한계에 이르렀을 거예요. 그런데 전체적인 사고방식을 사용하는 방법에서 거의 차이가 안 나요. 합격한 프로그래머도 머릿속에서 어떻게 해야 할지 알 거예요. 약간 베르사유 맛이 나요.
코드!!!!
 
public class OkhttpInstance {


    private static OkHttpClient okHttpClient;
    private static Response response;

    public static synchronized OkHttpClient createInstance() {
        if (okHttpClient == null) {
            synchronized (OkhttpInstance.class) {
                if (okHttpClient == null) {
                    okHttpClient = new OkHttpClient.Builder()
                            .connectTimeout(60, TimeUnit.SECONDS)      //      
                            .readTimeout(60, TimeUnit.SECONDS)         //     
                            .writeTimeout(60, TimeUnit.SECONDS)        //     
                            .retryOnConnectionFailure(true)            //      
                            .addInterceptor(interceptor)  //     
                            .build();
                }
            }
        }
        return okHttpClient;
    }

    private static Interceptor interceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            Request.Builder requestBuilder = request.newBuilder();

            //post    
            if (request.body() instanceof FormBody) {
                FormBody.Builder newFormBody = new FormBody.Builder();//     
                FormBody oidFormBody = (FormBody) request.body();//    
                //     request Body   FormBody    size   FormBody          
                for (int i = 0; i < oidFormBody.size(); i++) {
                    String str = oidFormBody.encodedValue(i);//value
                    String decode = URLDecoder.decode(str);// value  URLDecoder  
                    String s = oidFormBody.encodedName(i);//name
                    String name = URLDecoder.decode(s);// name  URLDecoder                              URLDecoder                 
                    String encrypt = DesCipherUtil.encrypt(decode, HDUrl.PAS);//des   HDUrl.PAS                   
                    newFormBody.addEncoded(name.trim(), encrypt.trim());//        !!       
                }
                requestBuilder.method(request.method(), newFormBody.build());
            }

            request = requestBuilder.build();
//            get    
            //        
            HttpUrl url = request.url();
            String path = url.encodedPath();//
            String query = url.encodedQuery();//    
            if (!TextUtils.isEmpty(query)) {

                StringBuffer sb = new StringBuffer();
                sb.append(HDUrl.DEFAULT).append(path).append("?");//HDUrl.DEFAULT       :https://192.16.2.88            
                Set queryList = url.queryParameterNames();
                Iterator iterator = queryList.iterator();
                for (int i = 0; i < queryList.size(); i++) {

                    String queryName = iterator.next();
                    sb.append(queryName).append("=");
                    String queryKey = url.queryParameter(queryName);
                    // query key    
                    if (TextUtils.isEmpty(queryKey) || null == queryKey || "null".equals(queryKey) || queryKey.length() == 0 || "".equals(queryKey)) {
                    } else {
                        Log.e("tag", "queryKey-----------" + queryKey);
                        sb.append(DesCipherUtil.encrypt(queryKey, HDUrl.PAS));
                    }
                    if (iterator.hasNext()) {
                        sb.append("&");
                    }
                }
                String newUrl = sb.toString();
//                      get    
                Request.Builder url1 = request.newBuilder()
                        .url(newUrl);
                request = url1.build();

            }
            response = chain.proceed(request);
            byte[] data = response.body().bytes();
            String s = new String(data);
            MediaType mediaType = response.body().contentType();
            try {
                Log.e("tag", "s-----------------------" + s);
                JSONObject jsonObject = new JSONObject(s);
                int code = 0;
                if (jsonObject.has("code")) {
                    code = jsonObject.getInt("code");
                } else {
                    code = jsonObject.getInt("errCode");
                }
                if (code == 200 || code == 0) {
//                     code=200/0   
                    if (jsonObject.has("data")) {
                        String code1 = jsonObject.getString("data");
                        String decrypt = DesCipherUtil.decrypt(code1, HDUrl.PAS);
                        jsonObject.remove("data");
                        jsonObject.put("data", decrypt);
                        Gson gson = new Gson();
//
                        DefaultBean defaultBean = gson.fromJson(s, DefaultBean.class);
                        if (decrypt.substring(0, 1).equals("[")) {
                            List arrData = gson.fromJson(decrypt, new TypeToken>() {
                            }.getType());
                            defaultBean.setData(arrData);
                        } else if (decrypt.substring(0, 1).equals("{")) {
                            Object objectData = gson.fromJson(decrypt, Object.class);
                            defaultBean.setData(objectData);
                        } else {
                            defaultBean.setData(decrypt);
                        }
                        s = new Gson().toJson(defaultBean);
                    }


                } else if (code == 10100) {
                    //   token   
                    Thread thread = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            Looper.prepare();
                            UserInfo userInfo = (UserInfo) ShareprefencesUtils.getBean(App.getApplicationContent(), ShareprefencesUtils.USER_INFO);
                            userInfo.setAccess_token("");
                            ShareprefencesUtils.putBean(App.getApplicationContent(), ShareprefencesUtils.USER_INFO, userInfo);
                            Intent intent = new Intent(App.getApplicationContent(), SelectJoinActivity.class)
                                    .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                            App.getApplicationContent().startActivity(intent);
                            Toast.makeText(App.getApplicationContent(), "         ", Toast.LENGTH_SHORT).show();
                            Looper.loop();
                        }
                    });
                    thread.start();
                }

            } catch (JSONException e) {
                e.printStackTrace();
            }
            return response.newBuilder()
                    .body(ResponseBody.create(mediaType, s))
                    .build();
        }
    };

    public static synchronized OkHttpClient getInstance() {
        return okHttpClient;
    }

사실 쉽게 알아볼 수 있는 것들은 제가 설명을 안 할게요. 알아볼게요. DES 암호화 해독류를 붙여볼게요.
 private DesCipherUtil() {
        throw new AssertionError("No DesCipherUtil instances for you!");
    }

    static {
        // add BC provider
//        Security.addProvider(new BouncyCastleProvider());
    }

    /**
     *   
     * 
     * @param encryptText        
     * @param key     
     * @return    Base64      
     */
    @SuppressLint("NewApi")
    public static String encrypt(String encryptText, String key) {

        if (encryptText == null || key == null) {
            throw new IllegalArgumentException("encryptText or key must not be null");
        }

        try {
            DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec);

            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS7Padding", "BC");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] bytes = cipher.doFinal(encryptText.getBytes(Charset.forName("UTF-8")));
            return Base64.getEncoder().encodeToString(bytes);

        } catch (NoSuchAlgorithmException | InvalidKeyException | InvalidKeySpecException | NoSuchPaddingException
            | BadPaddingException | NoSuchProviderException | IllegalBlockSizeException e) {
            throw new RuntimeException("encrypt failed", e);
        }

    }

    /**
     *   
     * 
     * @param decryptText        
     * @param key     ,  Base64  
     * @return        
     */
    public static  String decrypt(String decryptText, String key) {

        if (decryptText == null || key == null) {
            throw new IllegalArgumentException("decryptText or key must not be null");
        }

        try {
            DESKeySpec desKeySpec = new DESKeySpec(key.getBytes());
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = secretKeyFactory.generateSecret(desKeySpec);

            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS7Padding", "BC");
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] bytes = new byte[0];
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                bytes = cipher.doFinal(Base64.getDecoder().decode(decryptText));
            }
            return new String(bytes, Charset.forName("UTF-8"));

        } catch (NoSuchAlgorithmException | InvalidKeyException | InvalidKeySpecException | NoSuchPaddingException
            | BadPaddingException | NoSuchProviderException | IllegalBlockSizeException e) {
            throw new RuntimeException("decrypt failed", e);
        }
    }
    public static void main(String[] args) {

	}

이것들은 모두 제가 실제로 사용하고 있는 프로젝트에 문제가 있으니 의심하지 마세요. 제 코드에 문제가 없어요. 츤데레 얼굴.

좋은 웹페이지 즐겨찾기