Runt
2025-08-05 c96a3660d8257820c55bc3f1429c07adc364fe7d
加解密优化
7 files modified
51 ■■■■ changed files
libmvi/build.gradle.kts 2 ●●● patch | view | raw | blame | history
libmvi/src/main/java/com/runt/open/mvi/data/PhoneDevice.java 3 ●●●● patch | view | raw | blame | history
libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/HttpLoggingInterceptor.java 12 ●●●●● patch | view | raw | blame | history
libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/OpenInterceptor.java 2 ●●● patch | view | raw | blame | history
libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/DecryptGsonResponseBodyConverter.java 7 ●●●● patch | view | raw | blame | history
libmvi/src/main/java/com/runt/open/mvi/retrofit/utils/RSAUtils.java 23 ●●●●● patch | view | raw | blame | history
libmvi/src/main/java/com/runt/open/mvi/retrofit/utils/RetrofitUtils.java 2 ●●● patch | view | raw | blame | history
libmvi/build.gradle.kts
@@ -22,7 +22,7 @@
        }
        release {
            isMinifyEnabled = false
            buildConfigField("String","HOST_IP_ADDR","\"http://192.168.28.175:8888/advert/\"")
            buildConfigField("String","HOST_IP_ADDR","\"http://www.hefan.space/advert/\"")
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt") , "proguard-rules.pro")
        }
    }
libmvi/src/main/java/com/runt/open/mvi/data/PhoneDevice.java
@@ -4,7 +4,6 @@
import android.os.Build;
import com.runt.open.mvi.retrofit.utils.NetWorkUtils;
import com.runt.open.mvi.utils.DeviceIdUtils;
/**
@@ -20,7 +19,7 @@
    static PhoneDevice device;
    public static void setDevice(Context context) {
        device = new PhoneDevice(Build.BRAND,Build.MODEL,Build.VERSION.SDK_INT+"",Build.VERSION.RELEASE, DeviceIdUtils.getDeviceId(context), NetWorkUtils.getNetIp());
        device = new PhoneDevice(Build.BRAND,Build.MODEL,Build.VERSION.SDK_INT+"",Build.VERSION.RELEASE, "", NetWorkUtils.getNetIp());
    }
    public static PhoneDevice getDevice() {
libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/HttpLoggingInterceptor.java
@@ -5,6 +5,7 @@
import com.runt.open.mvi.retrofit.net.NetWorkCost;
import com.runt.open.mvi.retrofit.net.NetWorkListener;
import com.runt.open.mvi.retrofit.utils.HttpPrintUtils;
import com.runt.open.mvi.retrofit.utils.RSAUtils;
import org.json.JSONArray;
import org.json.JSONException;
@@ -205,7 +206,16 @@
                if (contentLength != 0) {
                    String str = buffer.clone().readString(charset);
                    if(str.trim().indexOf("{") == 0) {
                        logArrays.add(new JSONObject(str).toString(4));
                        JSONObject object = new JSONObject(str);
                        if(object.has("body")){
                            try {
                                logArrays.add(new JSONObject(RSAUtils.decryptVerify(object.getString("body"))).toString(4));
                            } catch (Exception e) {
                                throw new RuntimeException(e);
                            }
                        }else{
                            logArrays.add(object.toString(4));
                        }
                    }else if(str.trim().indexOf("[") == 0) {
                        logArrays.add(new JSONArray(str).toString(4));
                    }else{
libmvi/src/main/java/com/runt/open/mvi/retrofit/Interceptor/OpenInterceptor.java
@@ -33,7 +33,7 @@
public class OpenInterceptor implements Interceptor {
    protected final Charset UTF8 = Charset.forName("UTF-8");
    protected final String ENCRYPT = "encrypt";
    protected final String ENCRYPT = "body";
    @Override
    public Response intercept(Chain chain) throws IOException {
libmvi/src/main/java/com/runt/open/mvi/retrofit/converter/DecryptGsonResponseBodyConverter.java
@@ -13,7 +13,6 @@
import com.runt.open.mvi.utils.GsonUtils;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -36,7 +35,7 @@
    private final TypeAdapter<T> adapter;
    private final Charset UTF_8 = Charset.forName("UTF-8");
    private final boolean transHump;//驼峰转换
    private final String ENCRYPT = "encrypt";
    private final String ENCRYPT = "body";
    public DecryptGsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter, boolean transHump) {
        this.gson = gson;
@@ -88,9 +87,7 @@
        if(TextUtils.isEmpty(body)){
        }else if(body.indexOf("{") == 0) {
            JSONObject json = new JSONObject(body);
            body = RSAUtils.decrypt(json.getString(ENCRYPT), RSAUtils.getPublicKey(RSAUtils.PUBLIC_KEY));//
            //Log.e("Converter", "decryptJsonStr body:" + body);
            body = RSAUtils.decryptVerify(body,ENCRYPT);
        }
        return transHump? GsonUtils.toHumpJson(body):body;
    }
libmvi/src/main/java/com/runt/open/mvi/retrofit/utils/RSAUtils.java
@@ -2,6 +2,8 @@
import android.util.Base64;
import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.security.Key;
import java.security.KeyFactory;
@@ -19,7 +21,7 @@
public class RSAUtils {
    //客户端私钥
    public static final String PRIVATE_KEY = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALBGei0scHoOjTLImPHvASaGqYNrdLie0ckWp74Nkqv7FVeXPOvWEG8_jRJCVjJ1grr8SGd9sVY2sxn5XIz7fUEBfx7Vm8m0DaCNBWJpFLGw9xiaVZ2AUKoNyTD4NgZobbwZbt6ZNB6_fggPrGF18pq6GPyCndX1JW8ZiZKj33VBAgMBAAECgYB0q-EX3y7_CnyYXT8l-mxHhJ_T9R6HR89QimcyGqe2nvRMSjSvX7r29xg3OqL0uORzQKHnpcDncELw8SQ5yAbpENeIsD0dvdFlkoyFYU4ljeUbJ46binwwg20TNARjTbpNos9zbhTPh8qixdblxppXA1WC18HtXhixgca5bNG9lQJBAPQfNdpNdDL9l8Tw4hYVuDMszcFuZYbHbm0S4xcwqj-dXNWBztNf5W_K92-N5GIoHbOypkGzjlBjSZi_oKA0HusCQQC42irhw682CG44mKdP6YRDxy6OaauVX4yE9WnsbO8JFSSc9ZCKMMD0F3NGtytDrVMAJxG1iPWXa4ptEdtgwCmDAkAUW1npR1YuPllekdu4jb0bf1v1ClirAYxiyhVnxKYdweiQ4U827yM5zEoP4lwuFzxK1NXqWqe-alkjxK8HTPFbAkAviQLf_adP2MknSrIzzZQSreTeAHR8PA7xnf54KucpScOZjVh3AOSNoH4nYDEC_U5LysA2E5s8Lg5xz9a_QYsrAkEAwV6gNED7_SYDsYyEWimQ6znUb_QSY-sSChnSCY-ILG1wpynBHw_t1Oi3ljl6gL_cYKG1O3uwOtvZtb-Vr1bNkQ";
    public static final String PRIVATE_KEY = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBALmG22Y82CPx/n7yE6Y/lh33ZoQxWdp9LeWH7DN07dp/5Od9PY6Eix2XBjI4mRWoRv71gtbA3+nq9aaztibWGvjD/akMGTTgWD2BXQI3kw4CrGI0P1YzoFFM0oGUqd9duUzJpl8Lpq/3JpB1vo+c6EsVqggWJoPpIJNb2pcEBC3fAgMBAAECgYEAmmd5C3KR9AB/7Qjtf4wmFJSFNnmYLXXHD+N6miyzlAii6mHaLFV1LlA1sPBXv6WISMLtfGuTLywD/BRPAa1pTbrQTz3BDvtHHrCaL124ZdIr1j49TGyyYRCplwDoP9QWKTtEcZ6mP0P0rzh2Zfe2nBaJDn2qFPmYd9P4WBGMW1kCQQDop0oMK/oDc7gFQqXf0CnEETsOjJrvVzOuRue54WLl1H62PXhsGFzNvlm4J4OqMlLpnX6et7dzgX2MAVlJKP3jAkEAzCTqOo1l/E5bN00HFcQ3odCr5Pi985OK17R1ueAiLoY6g3I6O88zDWCiB5XmQPMSJ6QcNPIxAsJI6JGVqMZQ1QJACyhStci6IcY/8gijOdua1StaYLU/jPDqqpX98P0tKAaL2SOTjeORN9DELr++YcAuF8QU2XnIE4MHSVqbNJYBrwJBAKxkwCiSH/3hbcZVlhYbjZ9oyMCkDkUT47wk+QXu8O65C9DVNbgsUcCKSkp9m+RdYId5XxiXLixWRZug1fGhB8ECQQDTPTxN9RhunrUaT0brQsd+0btrYMrm/suaBzJyBpspFzjxRcM+AhlAHa1szkMqE6r01ZHCFQopaZEWijeh4Kgf";
    //服务器公钥
    public static final String PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVj4BkEYtlv8z4quUUrkRvW4xuWQvXegMuLKPQZky8LObbxfFZniSvQ4gllFlyFuCjeeInjyQFPC3ARdbihV3P88drBsB2gCG9lwlCkgMjZfSc/hxC4VirsHbGGSIN5oPyCZMQNAUnIojpKBRlE0TJmHvP+FpAe46Yb+oPs8R5DQIDAQAB";
@@ -56,7 +58,7 @@
     */
    public static PrivateKey getPrivateKey(String privateKey) throws Exception {
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_RSA);
        byte[] decodedKey = Base64.decode(privateKey.getBytes(), Base64.URL_SAFE);
        byte[] decodedKey = Base64.decode(privateKey.getBytes(), Base64.DEFAULT);
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedKey);
        return keyFactory.generatePrivate(keySpec);
    }
@@ -140,6 +142,23 @@
        return new String(decryptedData, "UTF-8");
    }
    public static String decryptVerify(String data,String key) throws Exception{
        JSONObject jsonBody = new JSONObject(data);
        return decryptVerify(jsonBody.getString(key));
    }
    public static String decryptVerify(String body) throws Exception{
        String decrypted = RSAUtils.decrypt(body, RSAUtils.getPrivateKey(RSAUtils.PRIVATE_KEY));
        JSONObject json = new JSONObject(decrypted);
        //服务端公钥验证加签是否正确
        String decryptBody = json.getString("body");
        if(RSAUtils.verify(decryptBody,//内容
                RSAUtils.getPublicKey(RSAUtils.PUBLIC_KEY),//服务端公钥
                json.getString("sign"))/*加签*/) {
            body = decryptBody;
        }
        return body;
    }
    /**
     * 签名
     *
libmvi/src/main/java/com/runt/open/mvi/retrofit/utils/RetrofitUtils.java
@@ -209,7 +209,7 @@
                //设置OKHttpClient
                .client(client)
                //设置baseUrl,注意,baseUrl必须后缀"/"
                .baseUrl(BuildConfig.HOST_IP_ADDR+"api/v2/")
                .baseUrl(BuildConfig.HOST_IP_ADDR+"api/v4/")
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
    }