diff --git a/app/libs/sun.misc.BASE64Decoder.jar b/app/libs/sun.misc.BASE64Decoder.jar deleted file mode 100644 index 9811c13..0000000 Binary files a/app/libs/sun.misc.BASE64Decoder.jar and /dev/null differ diff --git a/app/src/main/java/xyz/fycz/myreader/application/App.java b/app/src/main/java/xyz/fycz/myreader/application/App.java index 3536e01..b5ecb92 100644 --- a/app/src/main/java/xyz/fycz/myreader/application/App.java +++ b/app/src/main/java/xyz/fycz/myreader/application/App.java @@ -37,10 +37,8 @@ import java.security.cert.X509Certificate; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; @@ -55,7 +53,7 @@ import xyz.fycz.myreader.ui.activity.MainActivity; import xyz.fycz.myreader.ui.dialog.APPDownloadTip; import xyz.fycz.myreader.ui.dialog.DialogCreator; import xyz.fycz.myreader.ui.fragment.BookcaseFragment; -import xyz.fycz.myreader.util.HttpUtil; +import xyz.fycz.myreader.util.SSLSocketClient; import xyz.fycz.myreader.util.SharedPreUtils; import xyz.fycz.myreader.util.StringHelper; import xyz.fycz.myreader.util.ToastUtils; @@ -79,7 +77,7 @@ public class App extends Application { application = this; debug = isApkInDebug(this); firstInit(); - HttpUtil.trustAllHosts();//信任所有证书 + SSLSocketClient.trustAllHosts();//信任所有证书 RxJavaPlugins.setErrorHandler(Functions.emptyConsumer()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { webviewSetPath(this); diff --git a/app/src/main/java/xyz/fycz/myreader/util/Coder.java b/app/src/main/java/xyz/fycz/myreader/util/Coder.java deleted file mode 100644 index 9bedab2..0000000 --- a/app/src/main/java/xyz/fycz/myreader/util/Coder.java +++ /dev/null @@ -1,102 +0,0 @@ -package xyz.fycz.myreader.util; - -import java.security.MessageDigest; - -import javax.crypto.KeyGenerator; -import javax.crypto.Mac; -import javax.crypto.SecretKey; -import javax.crypto.spec.SecretKeySpec; - -import Decoder.BASE64Decoder; -import Decoder.BASE64Encoder; - - -public abstract class Coder { - public static final String KEY_SHA = "SHA"; - public static final String KEY_MD5 = "MD5"; - - /** - * MAC算法可选以下多种算法 - *
-     * HmacMD5 
-     * HmacSHA1 
-     * HmacSHA256 
-     * HmacSHA384 
-     * HmacSHA512
-     * 
- */ - public static final String KEY_MAC = "HmacMD5"; - - /** - * BASE64解密 - * @param key - * @return - * @throws Exception - */ - public static byte[] decryptBASE64( String key ) throws Exception { - return (new BASE64Decoder()).decodeBuffer(key); - } - - /** - * BASE64加密 - * @param key - * @return - * @throws Exception - */ - public static String encryptBASE64(byte[] key) throws Exception { - return (new BASE64Encoder()).encodeBuffer(key); - } - - /** - * MD5 加密 - * @param data - * @return - * @throws Exception - */ - public static byte[] encryptMD5( byte[] data) throws Exception { - MessageDigest md5 = MessageDigest.getInstance(KEY_MD5); - md5.update(data); - - return md5.digest(); - } - - /** - * SHA 加密 - * @param data - * @return - * @throws Exception - */ - public static byte[] encryptSHA( byte[] data) throws Exception { - MessageDigest sha = MessageDigest.getInstance(KEY_SHA); - sha.update(data); - - return sha.digest(); - } - - /** - * 初始化HMAC密钥 - * - * @return - * @throws Exception - */ - public static String initMacKey() throws Exception { - KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC); - - SecretKey secretKey = keyGenerator.generateKey(); - return encryptBASE64(secretKey.getEncoded()); - } - - /** - * HMAC 加密 - * @param data - * @param key - * @return - * @throws Exception - */ - public static byte[] encryptHMAC( byte[] data, String key) throws Exception { - SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC); - Mac mac = Mac.getInstance(secretKey.getAlgorithm()); - mac.init(secretKey); - return mac.doFinal(data); - } -} \ No newline at end of file diff --git a/app/src/main/java/xyz/fycz/myreader/util/HttpUtil.java b/app/src/main/java/xyz/fycz/myreader/util/HttpUtil.java deleted file mode 100644 index a5c9550..0000000 --- a/app/src/main/java/xyz/fycz/myreader/util/HttpUtil.java +++ /dev/null @@ -1,496 +0,0 @@ -package xyz.fycz.myreader.util; - -import android.annotation.SuppressLint; -import android.graphics.Bitmap; -import android.util.Base64; -import android.util.Log; - -import com.google.gson.Gson; -import okhttp3.*; -import xyz.fycz.myreader.R; -import xyz.fycz.myreader.application.App; -import xyz.fycz.myreader.webapi.callback.HttpCallback; -import xyz.fycz.myreader.webapi.callback.JsonCallback; -import xyz.fycz.myreader.webapi.callback.URLConnectionCallback; -import xyz.fycz.myreader.common.APPCONST; -import xyz.fycz.myreader.common.URLCONST; -import xyz.fycz.myreader.entity.JsonModel; - -import java.io.*; -import java.net.HttpURLConnection; -import java.net.URL; -import java.net.URLConnection; -import java.security.SecureRandom; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; -import java.util.*; -import java.util.concurrent.TimeUnit; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; - -import static java.lang.String.valueOf; - - -public class HttpUtil { - - private static String sessionid; - //最好只使用一个共享的OkHttpClient 实例,将所有的网络请求都通过这个实例处理。 - //因为每个OkHttpClient 实例都有自己的连接池和线程池,重用这个实例能降低延时,减少内存消耗,而重复创建新实例则会浪费资源。 - private static OkHttpClient mClient; - - public static SSLSocketFactory createSSLSocketFactory() { - SSLSocketFactory ssfFactory = null; - try { - SSLContext sc = SSLContext.getInstance("TLS"); - sc.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom()); - ssfFactory = sc.getSocketFactory(); - } catch (Exception e) { - } - - return ssfFactory; - } - static class TrustAllCerts implements X509TrustManager { - @Override - public void checkClientTrusted(X509Certificate[] chain, String authType) {} - - @Override - public void checkServerTrusted(X509Certificate[] chain, String authType) {} - - @Override - public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];} - } - - public static X509TrustManager createTrustAllManager() { - X509TrustManager tm = null; - try { - tm = new X509TrustManager() { - @SuppressLint("TrustAllX509TrustManager") - public void checkClientTrusted(X509Certificate[] chain, String authType) { - //do nothing,接受任意客户端证书 - } - - @SuppressLint("TrustAllX509TrustManager") - public void checkServerTrusted(X509Certificate[] chain, String authType) { - //do nothing,接受任意服务端证书 - } - - public X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[0]; - } - }; - } catch (Exception ignored) { - } - return tm; - } - - private static Interceptor getHeaderInterceptor() { - return chain -> { - Request request = chain.request() - .newBuilder() - .addHeader("Keep-Alive", "300") - .addHeader("Connection", "Keep-Alive") - .addHeader("Cache-Control", "no-cache") - .build(); - return chain.proceed(request); - }; - } - - public static synchronized OkHttpClient getOkHttpClient() { - if (mClient == null) { - OkHttpClient.Builder builder = new OkHttpClient.Builder(); - builder.connectTimeout(5, TimeUnit.SECONDS) - .readTimeout(10, TimeUnit.SECONDS) - .writeTimeout(10, TimeUnit.SECONDS) - .sslSocketFactory(createSSLSocketFactory(), createTrustAllManager()) - .hostnameVerifier((hostname, session) -> true) - .protocols(Collections.singletonList(Protocol.HTTP_1_1)) - .addInterceptor(getHeaderInterceptor()); - mClient = builder - .build(); - } - return mClient; - - } - - - /** - * 图片发送 - * - * @param address - * @param callback - */ - public static void sendBitmapGetRequest(final String address, final HttpCallback callback) { - new Thread(new Runnable() { - HttpURLConnection connection = null; - - @Override - public void run() { - try { - URL url = new URL(address); - connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("GET"); - connection.setRequestProperty("Content-type", "application/octet-stream"); - connection.setRequestProperty("Accept-Charset", "utf-8"); - connection.setRequestProperty("contentType", "utf-8"); - connection.setConnectTimeout(10000); - connection.setReadTimeout(10000); - connection.setDoInput(true); - connection.setDoOutput(true); - InputStream in = connection.getInputStream(); - if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { - Log.e("Http", "网络错误异常!!!!"); - } - Log.d("Http", "connection success"); - if (callback != null) { - callback.onFinish(in); - } - } catch (Exception e) { - Log.e("Http", e.toString()); - if (callback != null) { - callback.onError(e); - } - } finally { - if (connection != null) { - connection.disconnect(); - } - } - } - - }).start(); - } - - /** - * get请求 - * - * @param address - * @param callback - */ - public static void sendGetRequest(final String address, final HttpCallback callback) { - new Thread(new Runnable() { - HttpURLConnection connection = null; - - @Override - public void run() { - try { - URL url = new URL(address); - connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("GET"); - connection.setRequestProperty("Content-type", "text/html"); - connection.setRequestProperty("Accept-Charset", "utf-8"); - connection.setRequestProperty("contentType", "utf-8"); - connection.setConnectTimeout(60 * 1000); - connection.setReadTimeout(60 * 1000); - connection.setDoInput(true); - connection.setDoOutput(true); - if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { - Log.e("Http", "网络错误异常!!!!"); - } - InputStream in = connection.getInputStream(); - Log.d("Http", "connection success"); - if (callback != null) { - callback.onFinish(in); - } - } catch (Exception e) { - e.printStackTrace(); - Log.e("Http", e.toString()); - if (callback != null) { - callback.onError(e); - } - } finally { - if (connection != null) { - connection.disconnect(); - } - } - } - }).start(); - } - - /** - * 网络通信测试请求 - * - * @param address - * @param callback - */ - public static void sendTestGetRequest(final String address, final HttpCallback callback) { - new Thread(new Runnable() { - HttpURLConnection connection = null; - - @Override - public void run() { - try { - URL url = new URL(address); - connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("GET"); - connection.setRequestProperty("Content-type", "text/html"); - connection.setRequestProperty("Accept-Charset", "utf-8"); - connection.setRequestProperty("contentType", "utf-8"); - connection.setConnectTimeout(3 * 1000); - connection.setReadTimeout(3 * 1000); - connection.setDoInput(true); - connection.setDoOutput(true); - if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { - Log.e("Http", "网络错误异常!!!!"); - } - InputStream in = connection.getInputStream(); - Log.d("Http", "connection success"); - if (callback != null) { - callback.onFinish(in); - } - } catch (Exception e) { - e.printStackTrace(); - Log.e("Http", e.toString()); - if (callback != null) { - callback.onError(e); - } - } finally { - if (connection != null) { - connection.disconnect(); - } - } - } - }).start(); - } - - public static void sendGetRequest_okHttp(final String address, boolean isRefresh, final HttpCallback callback) { - App.getApplication().newThread(() -> { - try { - OkHttpClient client = getOkHttpClient(); - Request.Builder requestBuilder = new Request.Builder() - .addHeader("Accept", "*/*") - .addHeader("Connection", "Keep-Alive") - //.addHeader("Charsert", "utf-8") - .addHeader("Cache-Control", "no-cache") - .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36"); - if (address.contains("qidian.com")) { - SharedPreUtils spu = SharedPreUtils.getInstance(); - String cookie = spu.getString(App.getmContext().getString(R.string.qdCookie), ""); - if (cookie.equals("")) { - requestBuilder.addHeader("cookie", "_csrfToken=eXRDlZxmRDLvFAmdgzqvwWAASrxxp2WkVlH4ZM7e; newstatisticUUID=1595991935_2026387981"); - } else { - requestBuilder.addHeader("cookie", cookie); - } - } - requestBuilder.url(address); - Response response = client.newCall(requestBuilder.build()).execute(); - callback.onFinish(response.body().byteStream()); - } catch (Exception e) { - e.printStackTrace(); - callback.onError(e); - } - }); - } - - /** - * post请求 - * - * @param address - * @param output - * @param callback - */ - public static void sendPostRequest(final String address, final String output, final HttpCallback callback) { - App.getApplication().newThread(new Runnable() { - HttpURLConnection connection = null; - - @Override - public void run() { - try { - URL url = new URL(address); - connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("POST"); - connection.setConnectTimeout(60 * 1000); - connection.setReadTimeout(60 * 1000); - connection.setRequestProperty("user-agent", - "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4168.3 Safari/537.36"); - connection.setDoInput(true); - connection.setDoOutput(true); - if (output != null) { - // 获取URLConnection对象对应的输出流 - PrintWriter out = new PrintWriter(connection.getOutputStream()); - // 发送请求参数 - out.print(output); - // flush输出流的缓冲 - out.flush(); - } - InputStream in = connection.getInputStream(); - if (callback != null) { - callback.onFinish(in); - } - } catch (Exception e) { - if (callback != null) { - callback.onError(e); - } - } finally { - if (connection != null) { - connection.disconnect(); - } - } - } - }); - } - - /** - * post请求 获取蓝奏云直链 - * - * @param address - * @param output - * @param callback - */ - public static void sendPostRequest(final String address, final String output, final HttpCallback callback, final String referer) { - new Thread(new Runnable() { - HttpURLConnection connection = null; - - @Override - public void run() { - try { - URL url = new URL(address); - connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("POST"); - connection.setConnectTimeout(60 * 1000); - connection.setReadTimeout(60 * 1000); - connection.setRequestProperty("Referer", referer); - connection.setRequestProperty("user-agent", - "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4168.3 Safari/537.36"); - connection.setDoInput(true); - connection.setDoOutput(true); - if (output != null) { - DataOutputStream out = new DataOutputStream(connection.getOutputStream()); - out.writeBytes(output); - } - InputStream in = connection.getInputStream(); - if (callback != null) { - callback.onFinish(in); - } - } catch (Exception e) { - if (callback != null) { - callback.onError(e); - } - } finally { - if (connection != null) { - connection.disconnect(); - } - } - } - }).start(); - } - - /** - * 生成URL - * - * @param p_url - * @param params - * @return - */ - public static String makeURL(String p_url, Map params) { - if (params == null) return p_url; - StringBuilder url = new StringBuilder(p_url); - Log.d("http", p_url); - if (url.indexOf("?") < 0) - url.append('?'); - for (String name : params.keySet()) { - Log.d("http", name + "=" + params.get(name)); - url.append('&'); - url.append(name); - url.append('='); - try { - if (URLCONST.isRSA) { - if (name.equals("token")) { - url.append(valueOf(params.get(name))); - } else { - url.append(StringHelper.encode(Base64.encodeToString(RSAUtilV2.encryptByPublicKey(valueOf(params.get(name)).getBytes(), APPCONST.publicKey), Base64.DEFAULT).replace("\n", ""))); - } - } else { - url.append(valueOf(params.get(name))); - } - } catch (Exception e) { - e.printStackTrace(); - } - //不做URLEncoder处理 -// try { -// url.append(URLEncoder.encode(String.valueOf(params.get(name)), UTF_8)); -// } catch (UnsupportedEncodingException e) { -// // TODO Auto-generated catch block -// e.printStackTrace(); -// } - } - return url.toString().replace("?&", "?"); - } - - - /** - * 生成post输出参数串 - * - * @param params - * @return - */ - public static String makePostOutput(Map params) { - StringBuilder output = new StringBuilder(); - Iterator it = params.keySet().iterator(); - while (true) { - String name = it.next(); - Log.d("http", name + "=" + params.get(name)); - output.append(name); - output.append('='); - try { - if (URLCONST.isRSA) { - if (name.equals("token")) { - output.append(valueOf(params.get(name))); - } else { - output.append(StringHelper.encode(Base64.encodeToString(RSAUtilV2.encryptByPublicKey(valueOf(params.get(name)).getBytes(), APPCONST.publicKey), Base64.DEFAULT).replace("\n", ""))); - } - } else { - output.append(valueOf(params.get(name))); - } - } catch (Exception e) { - e.printStackTrace(); - } - if (!it.hasNext()) { - break; - } - output.append('&'); - //不做URLEncoder处理 -// try { -// url.append(URLEncoder.encode(String.valueOf(params.get(name)), UTF_8)); -// } catch (UnsupportedEncodingException e) { -// // TODO Auto-generated catch block -// e.printStackTrace(); -// } - } - return output.toString(); - } - - /** - * Trust every server - dont check for any certificate - */ - public static void trustAllHosts() { - final String TAG = "trustAllHosts"; - // Create a trust manager that does not validate certificate chains - TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { - - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - return new java.security.cert.X509Certificate[]{}; - } - - public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { - Log.i(TAG, "checkClientTrusted"); - } - - public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { - Log.i(TAG, "checkServerTrusted"); - } - }}; - - // Install the all-trusting trust manager - try { - SSLContext sc = SSLContext.getInstance("TLS"); - sc.init(null, trustAllCerts, new java.security.SecureRandom()); - HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); - } catch (Exception e) { - e.printStackTrace(); - } - } - -} diff --git a/app/src/main/java/xyz/fycz/myreader/util/RSACoder.java b/app/src/main/java/xyz/fycz/myreader/util/RSACoder.java deleted file mode 100644 index 5a979ba..0000000 --- a/app/src/main/java/xyz/fycz/myreader/util/RSACoder.java +++ /dev/null @@ -1,289 +0,0 @@ -package xyz.fycz.myreader.util; - -import android.util.Base64; - -import java.security.Key; -import java.security.KeyFactory; -import java.security.KeyPair; -import java.security.KeyPairGenerator; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.security.Signature; -import java.security.interfaces.RSAPrivateKey; -import java.security.interfaces.RSAPublicKey; -import java.security.spec.PKCS8EncodedKeySpec; -import java.security.spec.X509EncodedKeySpec; -import java.util.HashMap; -import java.util.Map; - -import javax.crypto.Cipher; - -/** - *
*RSA安全编码组件 - * - */ -public abstract class RSACoder extends Coder { - public static final String KEY_ALGORITHM = "RSA"; - public static final String SIGNATURE_ALGORITHM = "MD5withRSA"; - - private static final String PUBLIC_KEY = "RSAPublicKey"; - private static final String PRIVATE_KEY = "RSAPrivatekey"; - - /** - * 用私钥对信息生成数字签名 - * @param data 加密数据 - * @param privateKey 私钥 - * @return - * @throws Exception - */ - public static String sign(byte[] data, String privateKey) throws Exception { - //解密由base64编码的私钥 - byte[] keyBytes = decryptBASE64(privateKey); - - PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes); - - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - - //取私钥对象 - PrivateKey pKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); - - //用私钥生成数字签名 - Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); - signature.initSign(pKey); - signature.update(data); - - return encryptBASE64(signature.sign()); - } - - /** - * 校验数字签名 - * @param data 加密数据 - * @param publicKey 公钥 - * @param sign 数字签名 - * @return - * @throws Exception - */ - public static boolean verify(byte[] data, String publicKey, String sign) throws Exception { - - //解密有base64编码的公钥 - byte[] keyBytes = decryptBASE64(publicKey); - - X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); - - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - - //取公钥对象 - PublicKey pKey = keyFactory.generatePublic(keySpec); - - Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); - signature.initVerify(pKey); - signature.update(data); - //验证签名是否正常 - return signature.verify(decryptBASE64(sign)); - } - - /** - * 解密 - * 用私钥解密 - * @param data 加密数据 - * @param key - * @return - * @throws Exception - */ - public static byte[] decryptPrivateKey(byte[] data, String key) throws Exception { - byte[] keyBytes = decryptBASE64(key); - - //取得私钥 - PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(keyBytes); - KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM); - Key pKey = factory.generatePrivate(encodedKeySpec); - - //对数据解密 - Cipher cipher = Cipher.getInstance(factory.getAlgorithm()); - cipher.init(Cipher.DECRYPT_MODE, pKey); - - return cipher.doFinal(data); - } - - /** - * 用公钥解密 - * @param data - * @param key - * @return - * @throws Exception - */ - public static byte[] decryptByPublicKey( byte[] data, String key) throws Exception { - - //解密 - byte[] keyBytes = decryptBASE64(key); - - //取得公钥 - X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - Key pKey = keyFactory.generatePublic(keySpec); - - //对数据解密 - Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); - cipher.init(Cipher.DECRYPT_MODE, pKey); - - return cipher.doFinal(data); - } - - /** - * 用公钥加密 - * @param data - * @param key - * @return - * @throws Exception - */ - public static byte[] encryptByPublicKey( byte[] data, String key) throws Exception { - - byte[] keyBytes = decryptBASE64(key); - - X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - Key pKey = keyFactory.generatePublic(keySpec); - - - Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); - cipher.init(Cipher.ENCRYPT_MODE, pKey); - - return cipher.doFinal(data); - } - - /** - * 用私钥加密 - * @param data - * @param key - * @return - * @throws Exception - */ - public static byte[] encryptByPrivateKey(byte[] data, String key) throws Exception { - - byte[] keyBytes = decryptBASE64(key); - - PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - Key privateKey = keyFactory.generatePrivate(keySpec); - - Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); - cipher.init(Cipher.ENCRYPT_MODE, privateKey); - - return cipher.doFinal(data); - } - - /** - * 取得私钥 - * @param keyMap - * @return - * @throws Exception - */ - public static String getPrivateKey(Map keyMap) throws Exception { - - Key key = (Key) keyMap.get(PRIVATE_KEY); - - return encryptBASE64(key.getEncoded()); - } - - /** - * 取得公钥 - * @param keyMap - * @return - * @throws Exception - */ - public static String getPublicKey(Map keyMap) throws Exception { - - Key key = (Key) keyMap.get(PUBLIC_KEY); - - return encryptBASE64(key.getEncoded()); - } - /** - * 初始化密钥 - * @return - * @throws Exception - */ - public static Map initKey() throws Exception { - - KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM); - keyPairGenerator.initialize(1024); - - KeyPair keyPair = keyPairGenerator.generateKeyPair(); - //公钥 - RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); - - //私钥 - RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); - - Map keyMap = new HashMap(2); - keyMap.put(PRIVATE_KEY, privateKey); - keyMap.put(PUBLIC_KEY, publicKey); - return keyMap; - } - - public static void test() throws Exception - { - Map keyMap = RSAUtilV2.genKeyPair(); - - String publicKey = RSAUtilV2.getPublicKey(keyMap).replace("\n",""); - String privateKey = RSAUtilV2.getPrivateKey(keyMap).replace("\n",""); - - System.out.println("公钥:\n" + publicKey); - System.out.println("私钥:\n" + privateKey); - System.out.println("公钥加密——私钥解密"); - String inputStr = "{\\\"mobilePhone\\\":\\\"18577113435\\\",\\\"officePhone\\\":\\\"\\\",\\\"email\\\":\\\"test1@dwb.gxi.gov.cn\\\",\\\"token\\\":\\\"d87a6879-f5d3-4327-a5a5-43ed3ec31c8d\\\",\\\"realNameSzm\\\":\\\"c\\\",\\\"realNamePy\\\":\\\"ceshi1\\\",\\\"userState\\\":\\\"1\\\",\\\"sex\\\":\\\"male\\\",\\\"duty\\\":\\\"\\\",\\\"emailPwd\\\":\\\"test1@123456\\\",\\\"jurisdiction\\\":{\\\"meeting\\\":true,\\\"file\\\":true,\\\"supervise\\\":true,\\\"notice\\\":true,\\\"calendar\\\":true,\\\"document\\\":false,\\\"im\\\":true,\\\"email\\\":true,\\\"contacts\\\":true,\\\"commission\\\":false,\\\"meetingCount\\\":true,\\\"interview\\\":true},\\\"userName\\\":\\\"test01\\\",\\\"realName\\\":\\\"测试1\\\",\\\"userKey\\\":\\\"会议报名\\\",\\\"password\\\":\\\"e10adc3949ba59abbe56e057f20f883e\\\",\\\"activitiSync\\\":1,\\\"status\\\":1,\\\"currentDepartId\\\":\\\"8a8afb90582942f501582944770d0028\\\",\\\"currentDepartName\\\":\\\"文电处\\\",\\\"id\\\":\\\"40287d81585174ba0158523e3db20010\\\"}"; - byte[] data = inputStr.getBytes(); - - byte[] encodedData = RSAUtilV2.encryptByPublicKey(data, publicKey); - - String enconde = Base64.encodeToString(encodedData, Base64.DEFAULT); - - - - byte[] decodedData = RSAUtilV2.decryptByPrivateKey(Base64.decode(enconde, Base64.DEFAULT), - privateKey); - - String outputStr = new String(decodedData); - System.out.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr); - } - - public static void test2() throws Exception - { - Map keyMap = RSACoder.initKey(); - - String publicKey = RSACoder.getPublicKey(keyMap); - String privateKey = RSACoder.getPrivateKey(keyMap); - - System.out.println("公钥:\n" + publicKey); - System.out.println("私钥:\n" + privateKey); - - System.err.println("私钥加密——公钥解密"); - String inputStr = "sign"; - byte[] data = inputStr.getBytes(); - - byte[] encodedData = RSACoder.encryptByPrivateKey(data, privateKey); - - byte[] decodedData = RSACoder - .decryptByPublicKey(encodedData, publicKey); - - String outputStr = new String(decodedData); - System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr); - - - System.err.println("私钥签名——公钥验证签名"); - // 产生签名 - String sign = RSACoder.sign(encodedData, privateKey); - System.err.println("签名:\r" + sign); - - // 验证签名 - boolean status = RSACoder.verify(encodedData, publicKey, sign); - System.err.println("状态:\r" + status); - - } - - /* public static void main(String[] args) throws Exception { - - - //test2(); - test(); - }*/ -} \ No newline at end of file diff --git a/app/src/main/java/xyz/fycz/myreader/util/RSAUtilV2.java b/app/src/main/java/xyz/fycz/myreader/util/RSAUtilV2.java deleted file mode 100644 index bfaf807..0000000 --- a/app/src/main/java/xyz/fycz/myreader/util/RSAUtilV2.java +++ /dev/null @@ -1,478 +0,0 @@ -package xyz.fycz.myreader.util; - -/** - * Created by zhao on 2017/1/20. - */ - - -import java.io.ByteArrayOutputStream; -import java.security.Key; -import java.security.KeyFactory; -import java.security.KeyPair; -import java.security.KeyPairGenerator; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.security.Signature; -import java.security.interfaces.RSAPrivateKey; -import java.security.interfaces.RSAPublicKey; -import java.security.spec.PKCS8EncodedKeySpec; -import java.security.spec.X509EncodedKeySpec; -import java.util.HashMap; -import java.util.Map; - -import javax.crypto.Cipher; - - - -/** */ - -/** - *

- * RSA公钥/私钥/签名工具包 v2 UPDATE BY ZYL - *

- *

- * 罗纳德·李维斯特(Ron [R]ivest)、阿迪·萨莫尔(Adi [S]hamir)和伦纳德·阿德曼(Leonard [A]dleman) - *

- *

- * 字符串格式的密钥在未在特殊说明情况下都为BASE64编码格式
- * 由于非对称加密速度极其缓慢,一般文件不使用它来加密而是使用对称加密,
- * 非对称加密算法可以用来对对称加密的密钥加密,这样保证密钥的安全也就保证了数据的安全 - *

- *

- * 版本2更新变化: - * 1原版本密钥创建后保存在内存map中,新版本密钥创建后保存为public.key,private.key的功能(base64解码后保存). - * 2为保证生成文件的密钥内容可以显示并缩短加密后的长度,对需加密内容进行hex(16进制转换)处理后再加密. - * 即 - *

- * - * @author IceWee - * @version 1.0 - * @date 2012-4-26 - */ -public class RSAUtilV2 extends Coder { - - /** */ - /** - * 加密算法RSA - */ - public static final String KEY_ALGORITHM = "RSA"; - - /** */ - /** - * 签名算法 - */ - public static final String SIGNATURE_ALGORITHM = "MD5withRSA"; - - /** */ - /** - * 获取公钥的key - */ - private static final String PUBLIC_KEY = "RSAPublicKey"; - - /** */ - /** - * 获取私钥的key - */ - private static final String PRIVATE_KEY = "RSAPrivateKey"; - - /** */ - /** - * RSA最大加密明文大小 - */ - private static final int MAX_ENCRYPT_BLOCK = 117; - - /** */ - /** - * RSA最大解密密文大小 - */ - private static final int MAX_DECRYPT_BLOCK = 128; - - /** */ - /** - *

- * 生成密钥对(公钥和私钥) - *

- * - * @return - * @throws Exception - */ - public static Map genKeyPair() throws Exception { - KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);//"RSA" - keyPairGen.initialize(1024); - KeyPair keyPair = keyPairGen.generateKeyPair();//Generates a key pair 生成公钥私钥. - RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();//取得公钥 - RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();//取得私钥 - Map keyMap = new HashMap(2); - keyMap.put(PUBLIC_KEY, publicKey); - keyMap.put(PRIVATE_KEY, privateKey); - return keyMap; - } - - /** - * 将公钥私钥(默认base64加密)并转为公钥/私钥字符串还原为对应公钥/私钥 - * by Z10 - * - * @param keyType (publicKey / privateKey) - * @param keystr - * @return - * @throws Exception - */ - public Key getKeybyKeyStr(String keyType, String keystr) throws Exception { - if (keyType == null || !keyType.equals("")) { - throw new Exception("keyType can not be null"); - } - //需要返回公钥 - if (keyType.equals(keyType)) { - byte[] keyBytes = decryptBASE64(keystr); - X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - Key publicK = keyFactory.generatePublic(x509KeySpec); - return publicK; - } - //需要返回私钥 - else if (keyType.equals("privateKey")) { - byte[] keyBytes = decryptBASE64(keystr); - PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); - return privateK; - } else { - throw new Exception("keyType'value is incorrect"); - } - } - - - - /** */ - /** - *

- * 用私钥对信息生成数字签名 - *

- * - * @param data 已加密数据 - * @param privateKey 私钥(BASE64编码) - * @return - * @throws Exception - */ - public static String sign(byte[] data, String privateKey) throws Exception { - byte[] keyBytes = decryptBASE64(privateKey); - PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec); - Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); - signature.initSign(privateK); - signature.update(data); - return encryptBASE64(signature.sign()); - } - - /** */ - /** - * 校验数字签名 - *

- * - * @param data 已加密数据 - * @param publicKey 公钥(BASE64编码) - * @param sign 数字签名 - * @return - * @throws Exception - */ - public static boolean verify(byte[] data, String publicKey, String sign) - throws Exception { - byte[] keyBytes = decryptBASE64(publicKey); - X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - PublicKey publicK = keyFactory.generatePublic(keySpec); - Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); - signature.initVerify(publicK); - signature.update(data); - return signature.verify(decryptBASE64(sign)); - } - - - /** - * 私钥解密 by zyl - */ - public static byte[] decryptByPrivateKey(byte[] encryptedData, Key privateKey) throws Exception { - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - cipher.init(Cipher.DECRYPT_MODE, privateKey); - int inputLen = encryptedData.length; - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int offSet = 0; - byte[] cache; - int i = 0; - // 对数据分段解密 - while (inputLen - offSet > 0) { - if (inputLen - offSet > MAX_DECRYPT_BLOCK) { - cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); - } else { - cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet); - } - out.write(cache, 0, cache.length); - i++; - offSet = i * MAX_DECRYPT_BLOCK; - } - byte[] decryptedData = out.toByteArray(); - out.close(); - return decryptedData; - } - - /** */ - /** - * 私钥解密 - *

- * - * @param encryptedData 已加密数据 - * @param privateKey 私钥(BASE64编码) - * @return - * @throws Exception - */ - public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey) - throws Exception { - byte[] keyBytes = decryptBASE64(privateKey); - PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - cipher.init(Cipher.DECRYPT_MODE, privateK); - int inputLen = encryptedData.length; - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int offSet = 0; - byte[] cache; - int i = 0; - // 对数据分段解密 - while (inputLen - offSet > 0) { - if (inputLen - offSet > MAX_DECRYPT_BLOCK) { - cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); - } else { - cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet); - } - out.write(cache, 0, cache.length); - i++; - offSet = i * MAX_DECRYPT_BLOCK; - } - byte[] decryptedData = out.toByteArray(); - out.close(); - return decryptedData; - } - - - /** */ - /** - * 公钥解密 - *

- * - * @param encryptedData 已加密数据 - * @param publicKey 公钥(BASE64编码) - * @return - * @throws Exception - */ - public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey) - throws Exception { - - byte[] keyBytes = decryptBASE64(publicKey); - X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - Key publicK = keyFactory.generatePublic(x509KeySpec); - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - cipher.init(Cipher.DECRYPT_MODE, publicK); - int inputLen = encryptedData.length; - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int offSet = 0; - byte[] cache; - int i = 0; - // 对数据分段解密 - while (inputLen - offSet > 0) { - if (inputLen - offSet > MAX_DECRYPT_BLOCK) { - cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); - } else { - cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet); - } - out.write(cache, 0, cache.length); - i++; - offSet = i * MAX_DECRYPT_BLOCK; - } - byte[] decryptedData = out.toByteArray(); - out.close(); - return decryptedData; - } - - /** - * 公钥加密 by zyl - * - * @param data - * @param publicKey - * @return - */ - public static byte[] encryptByPublicKey(byte[] data, Key publicKey) throws Exception { - // 对数据加密 - /*根据公钥加密*/ - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - cipher.init(Cipher.ENCRYPT_MODE, publicKey); - int inputLen = data.length; - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int offSet = 0; - byte[] cache; - int i = 0; - // 对数据分段加密 - while (inputLen - offSet > 0) { - if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { - cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); - } else { - cache = cipher.doFinal(data, offSet, inputLen - offSet); - } - out.write(cache, 0, cache.length); - i++; - offSet = i * MAX_ENCRYPT_BLOCK; - } - byte[] encryptedData = out.toByteArray(); - out.close(); - return encryptedData; - } - - /** - *

- * 公钥加密 - *

- * - * @param data 源数据 - * @param publicKey 公钥(BASE64编码) - * @return - * @throws Exception - */ - public static byte[] encryptByPublicKey(byte[] data, String publicKey) - throws Exception { - byte[] keyBytes = decryptBASE64(publicKey); - X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - Key publicK = keyFactory.generatePublic(x509KeySpec); - // 对数据加密 - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - cipher.init(Cipher.ENCRYPT_MODE, publicK); - int inputLen = data.length; - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int offSet = 0; - byte[] cache; - int i = 0; - // 对数据分段加密 - while (inputLen - offSet > 0) { - if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { - cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); - } else { - cache = cipher.doFinal(data, offSet, inputLen - offSet); - } - out.write(cache, 0, cache.length); - i++; - offSet = i * MAX_ENCRYPT_BLOCK; - } - byte[] encryptedData = out.toByteArray(); - out.close(); - return encryptedData; - } - - /** - * 私钥加密by zyl - */ - public static byte[] encryptByPrivateKey(byte[] data, Key privateKey) throws Exception { - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - cipher.init(Cipher.ENCRYPT_MODE, privateKey); - int inputLen = data.length; - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int offSet = 0; - byte[] cache; - int i = 0; - // 对数据分段加密 - while (inputLen - offSet > 0) { - if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { - cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); - } else { - cache = cipher.doFinal(data, offSet, inputLen - offSet); - } - out.write(cache, 0, cache.length); - i++; - offSet = i * MAX_ENCRYPT_BLOCK; - } - byte[] encryptedData = out.toByteArray(); - out.close(); - return encryptedData; - } - - - /** */ - /** - *

- * 私钥加密 - *

- * - * @param data 源数据 - * @param privateKey 私钥(BASE64编码) - * @return - * @throws Exception - */ - public static byte[] encryptByPrivateKey(byte[] data, String privateKey) - throws Exception { - byte[] keyBytes = decryptBASE64(privateKey); - PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); - KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); - Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - cipher.init(Cipher.ENCRYPT_MODE, privateK); - int inputLen = data.length; - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int offSet = 0; - byte[] cache; - int i = 0; - // 对数据分段加密 - while (inputLen - offSet > 0) { - if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { - cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); - } else { - cache = cipher.doFinal(data, offSet, inputLen - offSet); - } - out.write(cache, 0, cache.length); - i++; - offSet = i * MAX_ENCRYPT_BLOCK; - } - byte[] encryptedData = out.toByteArray(); - out.close(); - return encryptedData; - } - - /** */ - /** - *

- * 获取私钥 - *

- * - * @param keyMap 密钥对 - * @return - * @throws Exception - */ - public static String getPrivateKey(Map keyMap) - throws Exception { - Key key = (Key) keyMap.get(PRIVATE_KEY); - return encryptBASE64(key.getEncoded()); - } - - /** */ - /** - *

- * 获取公钥 - *

- * - * @param keyMap 密钥对 - * @return - * @throws Exception - */ - public static String getPublicKey(Map keyMap) - throws Exception { - Key key = (Key) keyMap.get(PUBLIC_KEY); - return encryptBASE64(key.getEncoded()); - } - - /* public static void main(String[] args) throws Exception { - - - //test2(); - test(); - }*/ -} diff --git a/app/src/main/java/xyz/fycz/myreader/util/SSLSocketClient.java b/app/src/main/java/xyz/fycz/myreader/util/SSLSocketClient.java new file mode 100644 index 0000000..5e93411 --- /dev/null +++ b/app/src/main/java/xyz/fycz/myreader/util/SSLSocketClient.java @@ -0,0 +1,118 @@ +package xyz.fycz.myreader.util; + +import android.annotation.SuppressLint; +import android.graphics.Bitmap; +import android.util.Base64; +import android.util.Log; + +import com.google.gson.Gson; +import okhttp3.*; +import xyz.fycz.myreader.R; +import xyz.fycz.myreader.application.App; +import xyz.fycz.myreader.webapi.callback.HttpCallback; +import xyz.fycz.myreader.webapi.callback.JsonCallback; +import xyz.fycz.myreader.webapi.callback.URLConnectionCallback; +import xyz.fycz.myreader.common.APPCONST; +import xyz.fycz.myreader.common.URLCONST; +import xyz.fycz.myreader.entity.JsonModel; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.security.SecureRandom; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.*; +import java.util.concurrent.TimeUnit; + +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import static java.lang.String.valueOf; + + +public class SSLSocketClient { + + public static SSLSocketFactory createSSLSocketFactory() { + SSLSocketFactory ssfFactory = null; + try { + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, new TrustManager[]{createTrustAllManager()}, new SecureRandom()); + ssfFactory = sc.getSocketFactory(); + } catch (Exception e) { + } + + return ssfFactory; + } + + public static X509TrustManager createTrustAllManager() { + X509TrustManager tm = null; + try { + tm = new X509TrustManager() { + @SuppressLint("TrustAllX509TrustManager") + public void checkClientTrusted(X509Certificate[] chain, String authType) { + //do nothing,接受任意客户端证书 + } + + @SuppressLint("TrustAllX509TrustManager") + public void checkServerTrusted(X509Certificate[] chain, String authType) { + //do nothing,接受任意服务端证书 + } + + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + }; + } catch (Exception ignored) { + } + return tm; + } + + public static Interceptor getHeaderInterceptor() { + return chain -> { + Request request = chain.request() + .newBuilder() + .addHeader("Keep-Alive", "300") + .addHeader("Connection", "Keep-Alive") + .addHeader("Cache-Control", "no-cache") + .build(); + return chain.proceed(request); + }; + } + + /** + * Trust every server - dont check for any certificate + */ + public static void trustAllHosts() { + final String TAG = "trustAllHosts"; + // Create a trust manager that does not validate certificate chains + TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { + + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return new java.security.cert.X509Certificate[]{}; + } + + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + Log.i(TAG, "checkClientTrusted"); + } + + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + Log.i(TAG, "checkServerTrusted"); + } + }}; + + // Install the all-trusting trust manager + try { + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/app/src/main/java/xyz/fycz/myreader/util/utils/JsExtensions.java b/app/src/main/java/xyz/fycz/myreader/util/utils/JsExtensions.java index e60ec59..6377867 100644 --- a/app/src/main/java/xyz/fycz/myreader/util/utils/JsExtensions.java +++ b/app/src/main/java/xyz/fycz/myreader/util/utils/JsExtensions.java @@ -9,8 +9,7 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -import xyz.fycz.myreader.model.analyzeRule.AnalyzeUrl; -import xyz.fycz.myreader.util.HttpUtil; +import xyz.fycz.myreader.util.SSLSocketClient; @SuppressWarnings({"unused", "WeakerAccess"}) public interface JsExtensions { @@ -56,7 +55,7 @@ public interface JsExtensions { */ default Connection.Response get(String urlStr, Map headers) throws IOException { return Jsoup.connect(urlStr) - .sslSocketFactory(HttpUtil.createSSLSocketFactory()) + .sslSocketFactory(SSLSocketClient.createSSLSocketFactory()) .ignoreContentType(true) .followRedirects(false) .headers(headers) @@ -69,7 +68,7 @@ public interface JsExtensions { */ default Connection.Response post(String urlStr, String body, Map headers) throws IOException { return Jsoup.connect(urlStr) - .sslSocketFactory(HttpUtil.createSSLSocketFactory()) + .sslSocketFactory(SSLSocketClient.createSSLSocketFactory()) .ignoreContentType(true) .followRedirects(false) .requestBody(body) diff --git a/app/src/main/java/xyz/fycz/myreader/util/utils/OkHttpUtils.java b/app/src/main/java/xyz/fycz/myreader/util/utils/OkHttpUtils.java index 16d99f7..e09d96a 100644 --- a/app/src/main/java/xyz/fycz/myreader/util/utils/OkHttpUtils.java +++ b/app/src/main/java/xyz/fycz/myreader/util/utils/OkHttpUtils.java @@ -9,16 +9,37 @@ import org.jsoup.nodes.Document; import okhttp3.*; import xyz.fycz.myreader.application.App; -import xyz.fycz.myreader.util.HttpUtil; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.util.Collections; import java.util.Map; +import java.util.concurrent.TimeUnit; + +import static xyz.fycz.myreader.util.SSLSocketClient.createSSLSocketFactory; +import static xyz.fycz.myreader.util.SSLSocketClient.createTrustAllManager; +import static xyz.fycz.myreader.util.SSLSocketClient.getHeaderInterceptor; public class OkHttpUtils { - public static OkHttpClient okHttpClient = HttpUtil.getOkHttpClient(); + public static OkHttpClient mClient; + + public static synchronized OkHttpClient getOkHttpClient() { + if (mClient == null) { + OkHttpClient.Builder builder = new OkHttpClient.Builder(); + builder.connectTimeout(5, TimeUnit.SECONDS) + .readTimeout(10, TimeUnit.SECONDS) + .writeTimeout(10, TimeUnit.SECONDS) + .sslSocketFactory(createSSLSocketFactory(), createTrustAllManager()) + .hostnameVerifier((hostname, session) -> true) + .protocols(Collections.singletonList(Protocol.HTTP_1_1)) + .addInterceptor(getHeaderInterceptor()); + mClient = builder + .build(); + } + return mClient; + } /** * 同步获取html文件,默认编码utf-8 @@ -44,7 +65,7 @@ public class OkHttpUtils { .addHeader("Cache-Control", "no-cache") .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36"); if (headers != null) { - for (String name : headers.keySet()){ + for (String name : headers.keySet()) { builder.addHeader(name, headers.get(name)); } } @@ -57,7 +78,7 @@ public class OkHttpUtils { Request request = builder .url(url) .build(); - Response response = okHttpClient + Response response = getOkHttpClient() .newCall(request) .execute(); ResponseBody body = response.body(); @@ -76,7 +97,7 @@ public class OkHttpUtils { Request request = builder .url(url) .build(); - Response response = okHttpClient + Response response = getOkHttpClient() .newCall(request) .execute(); if (response.body() == null) { @@ -99,7 +120,7 @@ public class OkHttpUtils { Request request = builder .url(url) .build(); - Response response = okHttpClient + Response response = getOkHttpClient() .newCall(request) .execute(); ResponseBody body = response.body(); diff --git a/app/src/main/java/xyz/fycz/myreader/util/webdav/WebDav.kt b/app/src/main/java/xyz/fycz/myreader/util/webdav/WebDav.kt index d6fbee4..f1ae186 100644 --- a/app/src/main/java/xyz/fycz/myreader/util/webdav/WebDav.kt +++ b/app/src/main/java/xyz/fycz/myreader/util/webdav/WebDav.kt @@ -4,7 +4,8 @@ import xyz.fycz.myreader.util.webdav.http.Handler import xyz.fycz.myreader.util.webdav.http.HttpAuth import okhttp3.* import org.jsoup.Jsoup -import xyz.fycz.myreader.util.HttpUtil +import xyz.fycz.myreader.util.SSLSocketClient +import xyz.fycz.myreader.util.utils.OkHttpUtils import java.io.File import java.io.IOException import java.io.InputStream @@ -131,7 +132,7 @@ constructor(urlStr: String) { ) } request.header("Depth", if (depth < 0) "infinity" else depth.toString()) - return HttpUtil.getOkHttpClient().newCall(request.build()).execute() + return OkHttpUtils.getOkHttpClient().newCall(request.build()).execute() } return null } @@ -226,7 +227,7 @@ constructor(urlStr: String) { Credentials.basic(it.user, it.pass) ) } - val response = HttpUtil.getOkHttpClient().newCall(requestBuilder.build()).execute() + val response = OkHttpUtils.getOkHttpClient().newCall(requestBuilder.build()).execute() return response.isSuccessful } @@ -237,7 +238,7 @@ constructor(urlStr: String) { request.header("Authorization", Credentials.basic(it.user, it.pass)) } try { - return HttpUtil.getOkHttpClient().newCall(request.build()).execute().body()?.byteStream() + return OkHttpUtils.getOkHttpClient().newCall(request.build()).execute().body()?.byteStream() } catch (e: IOException) { e.printStackTrace() } catch (e: IllegalArgumentException) { diff --git a/app/src/main/java/xyz/fycz/myreader/webapi/HttpDataSource.java b/app/src/main/java/xyz/fycz/myreader/webapi/HttpDataSource.java deleted file mode 100644 index 623e800..0000000 --- a/app/src/main/java/xyz/fycz/myreader/webapi/HttpDataSource.java +++ /dev/null @@ -1,125 +0,0 @@ -package xyz.fycz.myreader.webapi; - -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.util.Base64; -import android.util.Log; - -import xyz.fycz.myreader.webapi.callback.JsonCallback; -import xyz.fycz.myreader.common.APPCONST; -import xyz.fycz.myreader.common.URLCONST; -import xyz.fycz.myreader.entity.JsonModel; -import xyz.fycz.myreader.util.HttpUtil; -import xyz.fycz.myreader.util.RSAUtilV2; -import xyz.fycz.myreader.util.StringHelper; -import com.google.gson.Gson; -import xyz.fycz.myreader.webapi.callback.HttpCallback; -import xyz.fycz.myreader.webapi.callback.ResultCallback; - -import java.io.BufferedReader; -import java.io.File; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.Map; - - -public class HttpDataSource { - - /** - * http请求 (get) ps:获取html - * @param url - * @param callback - */ - public static void httpGet_html(String url, final String charsetName, boolean isRefresh, final ResultCallback callback){ - Log.d("HttpGet URl", url); - HttpUtil.sendGetRequest_okHttp(url, isRefresh, new HttpCallback() { - @Override - public void onFinish(Bitmap bm) { - - } - - @Override - public void onFinish(InputStream in) { - try { - BufferedReader reader = new BufferedReader(new InputStreamReader(in, charsetName)); - StringBuilder response = new StringBuilder(); - String line = reader.readLine(); - while (line != null) { - response.append(line); - line = reader.readLine(); - } - if (callback != null) { - Log.d("Http", "read finish:" + response.toString()); - callback.onFinish(response.toString(),0); - } - } catch (Exception e) { - callback.onError(e); - } - } - - @Override - public void onFinish(String response) { - Log.d("Local", "read finish:" + response); - callback.onFinish(response, 0); - } - - @Override - public void onError(Exception e) { - if (callback != null) { - callback.onError(e); - } - } - - }); - } - - - - /** - * http请求 (post) 获取蓝奏云直链 - * @param url - * @param output - * @param callback - */ - public static void httpPost(String url, String output, final ResultCallback callback, final String referer) { - Log.d("HttpPost:", url + "&" + output); - HttpUtil.sendPostRequest(url, output, new HttpCallback() { - @Override - public void onFinish(Bitmap bm) { - - } - @Override - public void onFinish(InputStream in) { - try { - BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); - StringBuilder response = new StringBuilder(); - String line = reader.readLine(); - while (line != null) { - response.append(line); - line = reader.readLine(); - } - if (callback != null) { - Log.d("Http", "read finish:" + response); - callback.onFinish(response.toString(), 1); - } - } catch (Exception e) { - callback.onError(e); - } - } - - @Override - public void onFinish(String response) { - Log.e("http", response); - } - - @Override - public void onError(Exception e) { - if (callback != null) { - callback.onError(e); - } - } - }, referer); - } - -} diff --git a/app/src/main/java/xyz/fycz/myreader/widget/page/PageLoader.java b/app/src/main/java/xyz/fycz/myreader/widget/page/PageLoader.java index 79026d7..6ba81ee 100644 --- a/app/src/main/java/xyz/fycz/myreader/widget/page/PageLoader.java +++ b/app/src/main/java/xyz/fycz/myreader/widget/page/PageLoader.java @@ -1673,7 +1673,7 @@ public abstract class PageLoader { } // 重置段落 if (!showTitle) { - paragraph = paragraph.replaceAll("[ | ]", " ").trim(); + paragraph = StringUtils.trim(paragraph); // 如果只有换行符,那么就不执行 if (paragraph.equals("")) continue; paragraph = indent + paragraph + "\n";