Android Okhttp 차단기의 암호화 요청체(DES 암호화 해독)
이게 쉽잖아. 차단기에서 올릴 데이터를 직접 얻어서 암호화하고 재할당하는 게 쉽잖아.어이가 없어서 그냥 내 얼굴을 때렸어.
쓸데없는 소리 하지 말고 이 구덩이들을 다시 한 번 복습해 보겠습니다.
첫 번째 단계는 네트워크 요청 클래스에 차단기를 추가합니다
차단기에서 업로드된 데이터를 조작합니다
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
사실 쉽게 알아볼 수 있는 것들은 제가 설명을 안 할게요. 알아볼게요. 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) {
}
이것들은 모두 제가 실제로 사용하고 있는 프로젝트에 문제가 있으니 의심하지 마세요. 제 코드에 문제가 없어요. 츤데레 얼굴.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 차단기와 필터의 차이 분석그러면 클라이언트가 192.10.10.1 액세스 요청을 할 때 필터를 통해 클라이언트가 받은 응답은 이 IP 액세스 금지 알림입니다.자바 웹에서, 당신이 전송한request,response는 정보를 미리 필터링하거나...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.