From 7f48af50ef768162c5118d93598cd1300b4cb174 Mon Sep 17 00:00:00 2001 From: cmj <625783482@qq.com> Date: Fri, 5 Aug 2016 12:30:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=AF=86=E6=96=B0=E5=A2=9EMD5?= =?UTF-8?q?=E7=9B=90=E5=8A=A0=E5=AF=86=EF=BC=8C=E5=AE=8C=E5=96=84NetworkUt?= =?UTF-8?q?ils?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +- about_encrypt.md | 209 ++++++++++-------- about_network.md | 205 +++++++++++------ .../androidframework/utils/EncryptUtils.java | 144 ++++++------ .../androidframework/utils/NetworkUtils.java | 2 +- update_log.md | 3 +- 6 files changed, 332 insertions(+), 241 deletions(-) diff --git a/README.md b/README.md index f87f11e8..17e21897 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Android开发人员不得不收集的代码(不断更新) +# Android开发人员不得不收集的代码(持续更新中) 为方便查找,已进行大致归类,其目录如下所示: > - [App相关](https://github.com/Blankj/AndroidUtilCode/blob/master/about_app.md)→[AppUtils.java](https://github.com/Blankj/AndroidUtilCode/blob/master/androidframework/src/main/java/com/blankj/androidframework/utils/AppUtils.java) > - 安装指定路径下的Apk *installApp* @@ -30,12 +30,13 @@ > - [网络相关](https://github.com/Blankj/AndroidUtilCode/blob/master/about_network.md)→[NetworkUtils.java](https://github.com/Blankj/AndroidUtilCode/blob/master/androidframework/src/main/java/com/blankj/androidframework/utils/NetworkUtils.java) > - 打开网络设置界面 *openWirelessSettings* -> - 判断是否网络连接 *isConnected* +> - 判断网络是否可用 *isAvailable* +> - 判断网络是否连接 *isConnected* +> - 判断网络是否是4G *is4G* > - 判断wifi是否连接状态 *isWifiConnected* > - 获取移动网络运营商名称 *getNetworkOperatorName* > - 获取移动终端类型 *getPhoneType* -> - 获取连接的网络类型(2G,3G,4G) *getCurNetworkType* -> - 获取当前手机的网络类型(WIFI,2G,3G,4G) *getNetWorkStatus* +> - 获取当前的网络类型(WIFI,2G,3G,4G) *getNetWorkType* *getNetWorkTypeName* > - [手机相关](https://github.com/Blankj/AndroidUtilCode/blob/master/about_phone.md)→[PhoneUtils.java](https://github.com/Blankj/AndroidUtilCode/blob/master/androidframework/src/main/java/com/blankj/androidframework/utils/PhoneUtils.java) > - 判断设备是否是手机 *isPhone* @@ -99,6 +100,7 @@ #### 2016/08/02 新增隐藏状态栏,注释更加全面,工具类已封装,写的时候真的是一个一个测试过去的,宝宝心里苦 #### 2016/08/03 修复在onCreate中获取view尺寸的bug,MD5和SHA的Bug修复完成(在此感谢ssyijiu) #### 2016/08/04 新增时间工具类(在此感谢yi520000给的补充),手机正则分简单和精确(在此感谢MIkeeJY),新增判断是否锁屏,注释使用

分段落,目录按首字母排序 +#### 2016/08/05 加密新增MD5盐加密,完善NetworkUtils ##[关于Blankj](http://blankj.com/about) \ No newline at end of file diff --git a/about_encrypt.md b/about_encrypt.md index c4cd3d5b..ab1d1cb3 100644 --- a/about_encrypt.md +++ b/about_encrypt.md @@ -2,87 +2,91 @@ ### MD5加密 ``` java /** -* 一个byte转为2个hex字符 -*/ -public static String bytes2Hex(byte[] src) { - char[] res = new char[src.length * 2]; - final char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - for (int i = 0, j = 0; i < src.length; i++) { - res[j++] = hexDigits[src[i] >>> 4 & 0x0f]; - res[j++] = hexDigits[src[i] & 0x0f]; - } - return new String(res); + * MD5加密 + * + * @param data 明文字符串 + * @return 密文 + */ +public static String getMD5(String data) { + return getMD5(data.getBytes()); } /** -* MD5加密 -* -* @param data 明文 -* @return 密文 -*/ -public static String getMD5(String data) { - return TextUtils.isEmpty(data) ? "" : getMD5(data.getBytes()); + * MD5加密 + * + * @param data 明文字符串 + * @param salt 盐 + * @return 密文 + */ +public static String getMD5(String data, String salt) { + return bytes2Hex(encryptMD5((data + salt).getBytes())); } - + /** -* MD5加密 -* -* @param data 明文字节数组 -* @return 密文 -*/ + * MD5加密 + * + * @param data 明文字节数组 + * @return 密文 + */ public static String getMD5(byte[] data) { - if (data.length > 0) { - return bytes2Hex(encryptMD5(data)); - } - return ""; + return bytes2Hex(encryptMD5(data)); } - + /** -* MD5加密 -* -* @param data 明文字节数组 -* @return 密文字节数组 -*/ + * MD5加密 + * + * @param data 明文字节数组 + * @param salt 盐字节数组 + * @return 密文 + */ +public static String getMD5(byte[] data, byte[] salt) { + byte[] dataSalt = new byte[data.length + salt.length]; + System.arraycopy(data, 0, dataSalt, 0, data.length); + System.arraycopy(salt, 0, dataSalt, data.length, salt.length); + return bytes2Hex(encryptMD5(dataSalt)); +} + +/** + * MD5加密 + * + * @param data 明文字节数组 + * @return 密文字节数组 + */ public static byte[] encryptMD5(byte[] data) { - if (data.length > 0) { - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - md.update(data); - return md.digest(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(data); + return md.digest(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); } - return null; + return new byte[0]; } - - + /** -* 获取文件的MD5校验码 -* -* @param filePath 文件路径 -* @return 文件的MD5校验码 -*/ + * 获取文件的MD5校验码 + * + * @param filePath 文件路径 + * @return 文件的MD5校验码 + */ public static String getMD5File(String filePath) { - if (!TextUtils.isEmpty(filePath)) { - FileInputStream in = null; - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - in = new FileInputStream(filePath); - int len; - byte[] buffer = new byte[1024]; - while ((len = in.read(buffer)) != -1) { - md.update(buffer, 0, len); - } - return bytes2Hex(md.digest()); - } catch (NoSuchAlgorithmException | IOException e) { - e.printStackTrace(); - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException ignored) { - } + FileInputStream in = null; + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + in = new FileInputStream(filePath); + int len; + byte[] buffer = new byte[1024]; + while ((len = in.read(buffer)) != -1) { + md.update(buffer, 0, len); + } + return bytes2Hex(md.digest()); + } catch (NoSuchAlgorithmException | IOException e) { + e.printStackTrace(); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException ignored) { } } } @@ -93,43 +97,52 @@ public static String getMD5File(String filePath) { ### SHA加密 ``` /** -* SHA加密 -* -* @param data 明文 -* @return 密文 -*/ + * SHA加密 + * + * @param data 明文字符串 + * @return 密文 + */ public static String getSHA(String data) { - return TextUtils.isEmpty(data) ? "" : getSHA(data.getBytes()); + return getSHA(data.getBytes()); } - + /** -* SHA加密 -* -* @param data 明文字节数组 -* @return 密文 -*/ + * SHA加密 + * + * @param data 明文字节数组 + * @return 密文 + */ public static String getSHA(byte[] data) { - if (data.length > 0) { - return bytes2Hex(encryptSHA(data)); - } - return ""; + return bytes2Hex(encryptSHA(data)); } - + /** -* SHA加密 -* @param data 明文字节数组 -* @return 密文字节数组 -*/ + * SHA加密 + * + * @param data 明文字节数组 + * @return 密文字节数组 + */ public static byte[] encryptSHA(byte[] data) { - if (data.length > 0) { - try { - MessageDigest md = MessageDigest.getInstance("SHA"); - md.update(data); - return md.digest(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } + try { + MessageDigest md = MessageDigest.getInstance("SHA"); + md.update(data); + return md.digest(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return new byte[0]; +} + +/** + * 一个byte转为2个hex字符 + */ +public static String bytes2Hex(byte[] src) { + char[] res = new char[src.length * 2]; + final char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + for (int i = 0, j = 0; i < src.length; i++) { + res[j++] = hexDigits[src[i] >>> 4 & 0x0f]; + res[j++] = hexDigits[src[i] & 0x0f]; } - return null; + return new String(res); } ``` diff --git a/about_network.md b/about_network.md index f0d7bf27..547ac05b 100644 --- a/about_network.md +++ b/about_network.md @@ -14,20 +14,51 @@ public static void openWirelessSettings(Context context) { } ``` -### 判断是否网络连接 +### 判断网络是否可用 ``` java /** - * 判断是否网络连接 + * 获取活动网路信息 + */ +private static NetworkInfo getActiveNetworkInfo(Context context) { + ConnectivityManager cm = (ConnectivityManager) context + .getSystemService(Context.CONNECTIVITY_SERVICE); + return cm.getActiveNetworkInfo(); +} + +/** + * 判断网络是否可用 + *

需添加权限 + */ +public static boolean isAvailable(Context context) { + NetworkInfo info = getActiveNetworkInfo(context); + return info != null && info.isAvailable(); +} +``` + +### 判断网络是否连接 +``` java +/** + * 判断网络是否连接 *

需添加权限 */ public static boolean isConnected(Context context) { - ConnectivityManager cm = (ConnectivityManager) context - .getSystemService(Activity.CONNECTIVITY_SERVICE); - NetworkInfo info = cm.getActiveNetworkInfo(); + NetworkInfo info = getActiveNetworkInfo(context); return info != null && info.isConnected(); } ``` +### 判断网络是否是4G +``` java +/** + * 判断网络是否是4G + *

需添加权限 + */ +public static boolean is4G(Context context) { + NetworkInfo info = getActiveNetworkInfo(context); + return info != null && info.isAvailable() && info.getSubtype() == TelephonyManager.NETWORK_TYPE_LTE; +} +``` + ### 判断wifi是否连接状态 ``` java /** @@ -58,12 +89,14 @@ public static String getNetworkOperatorName(Context context) { ``` java /** * 获取移动终端类型 - *

- * PHONE_TYPE_NONE  : 0 手机制式未知
- * PHONE_TYPE_GSM   : 1 手机制式为GSM,移动和联通
- * PHONE_TYPE_CDMA  : 2 手机制式为CDMA,电信
- * PHONE_TYPE_SIP   : 3
- * 
+ *
+ * @return 手机制式
+ * 
  */
 public static int getPhoneType(Context context) {
     TelephonyManager tm = (TelephonyManager) context
@@ -72,72 +105,106 @@ public static int getPhoneType(Context context) {
 }
 ```
 
-### 获取连接的网络类型(2G,3G,4G)
+### 获取当前的网络类型(WIFI,2G,3G,4G)
 ``` java
 /**
- * 获取连接的网络类型(2G,3G,4G)
- * 

联通的3G为UMTS或HSDPA,移动和联通的2G为GPRS或EGDE,电信的2G为CDMA,电信的3G为EVDO + * 获取当前的网络类型(WIFI,2G,3G,4G) + *

需添加权限 + * + * @return 网络类型 + *

*/ -public static int getNetTpye(Context context) { - TelephonyManager telephonyManager = (TelephonyManager) context - .getSystemService(Context.TELEPHONY_SERVICE); - switch (telephonyManager.getNetworkType()) { - case TelephonyManager.NETWORK_TYPE_GPRS: - case TelephonyManager.NETWORK_TYPE_EDGE: - case TelephonyManager.NETWORK_TYPE_CDMA: - case TelephonyManager.NETWORK_TYPE_1xRTT: - case TelephonyManager.NETWORK_TYPE_IDEN: - return Constants.NETWORK_CLASS_2_G; - case TelephonyManager.NETWORK_TYPE_UMTS: - case TelephonyManager.NETWORK_TYPE_EVDO_0: - case TelephonyManager.NETWORK_TYPE_EVDO_A: - case TelephonyManager.NETWORK_TYPE_HSDPA: - case TelephonyManager.NETWORK_TYPE_HSUPA: - case TelephonyManager.NETWORK_TYPE_HSPA: - case TelephonyManager.NETWORK_TYPE_EVDO_B: - case TelephonyManager.NETWORK_TYPE_EHRPD: - case TelephonyManager.NETWORK_TYPE_HSPAP: - return Constants.NETWORK_CLASS_3_G; - case TelephonyManager.NETWORK_TYPE_LTE: - return Constants.NETWORK_CLASS_4_G; - default: - return Constants.NETWORK_CLASS_UNKNOWN; +public static int getNetWorkType(Context context) { + int netType = NETWORK_NO; + NetworkInfo info = getActiveNetworkInfo(context); + if (info != null && info.isAvailable()) { + + if (info.getType() == ConnectivityManager.TYPE_WIFI) { + netType = NETWORK_WIFI; + } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) { + switch (info.getSubtype()) { + + case NETWORK_TYPE_GSM: + case TelephonyManager.NETWORK_TYPE_GPRS: + case TelephonyManager.NETWORK_TYPE_CDMA: + case TelephonyManager.NETWORK_TYPE_EDGE: + case TelephonyManager.NETWORK_TYPE_1xRTT: + case TelephonyManager.NETWORK_TYPE_IDEN: + netType = NETWORK_2G; + break; + + case NETWORK_TYPE_TD_SCDMA: + case TelephonyManager.NETWORK_TYPE_EVDO_A: + case TelephonyManager.NETWORK_TYPE_UMTS: + case TelephonyManager.NETWORK_TYPE_EVDO_0: + case TelephonyManager.NETWORK_TYPE_HSDPA: + case TelephonyManager.NETWORK_TYPE_HSUPA: + case TelephonyManager.NETWORK_TYPE_HSPA: + case TelephonyManager.NETWORK_TYPE_EVDO_B: + case TelephonyManager.NETWORK_TYPE_EHRPD: + case TelephonyManager.NETWORK_TYPE_HSPAP: + netType = NETWORK_3G; + break; + + case NETWORK_TYPE_IWLAN: + case TelephonyManager.NETWORK_TYPE_LTE: + netType = NETWORK_4G; + break; + default: + + String subtypeName = info.getSubtypeName(); + if (subtypeName.equalsIgnoreCase("TD-SCDMA") + || subtypeName.equalsIgnoreCase("WCDMA") + || subtypeName.equalsIgnoreCase("CDMA2000")) { + netType = NETWORK_3G; + } else { + netType = NETWORK_UNKNOWN; + } + break; + } + } else { + netType = NETWORK_UNKNOWN; + } } + return netType; } -public class Constants { - // Unknown network class - public static final int NETWORK_CLASS_UNKNOWN = 0; - // wifi network - public static final int NETWORK_WIFI = 1; - // "2G" networks - public static final int NETWORK_CLASS_2_G = 2; - // "3G" networks - public static final int NETWORK_CLASS_3_G = 3; - // "4G" networks - public static final int NETWORK_CLASS_4_G = 4; -} -``` -### 获取当前手机的网络类型(WIFI,2G,3G,4G) -``` java /** - * 获取当前手机的网络类型(WIFI,2G,3G,4G) - *

需添加权限 - * 需要用到上面的方法 + * 获取当前的网络类型(WIFI,2G,3G,4G) + * 依赖上面的方法 + * + * @param context + * @return 网络类型名称 + *

*/ -public static int getCurNetworkType(Context context) { - int netWorkType = Constants.NETWORK_CLASS_UNKNOWN; - ConnectivityManager cm = (ConnectivityManager) context - .getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo networkInfo = cm.getActiveNetworkInfo(); - if (networkInfo != null && networkInfo.isConnected()) { - int type = networkInfo.getType(); - if (type == ConnectivityManager.TYPE_WIFI) { - netWorkType = Constants.NETWORK_WIFI; - } else if (type == ConnectivityManager.TYPE_MOBILE) { - netWorkType = getNetworkTpye(context); - } +public static String getNetWorkTypeName(Context context) { + switch (getNetWorkType(context)) { + case NETWORK_WIFI: + return "NETWORK_WIFI"; + case NETWORK_4G: + return "NETWORK_4G"; + case NETWORK_3G: + return "NETWORK_3G"; + case NETWORK_2G: + return "NETWORK_2G"; + case NETWORK_NO: + return "NETWORK_NO"; + default: + return "NETWORK_UNKNOWN"; } - return netWorkType; } ``` diff --git a/androidframework/src/main/java/com/blankj/androidframework/utils/EncryptUtils.java b/androidframework/src/main/java/com/blankj/androidframework/utils/EncryptUtils.java index 2d9ec350..ce6dae17 100644 --- a/androidframework/src/main/java/com/blankj/androidframework/utils/EncryptUtils.java +++ b/androidframework/src/main/java/com/blankj/androidframework/utils/EncryptUtils.java @@ -1,7 +1,5 @@ package com.blankj.androidframework.utils; -import android.text.TextUtils; - import java.io.FileInputStream; import java.io.IOException; import java.security.MessageDigest; @@ -18,15 +16,25 @@ public class EncryptUtils { throw new UnsupportedOperationException("u can't fuck me..."); } - /** * MD5加密 * - * @param data 明文 + * @param data 明文字符串 * @return 密文 */ public static String getMD5(String data) { - return TextUtils.isEmpty(data) ? "" : getMD5(data.getBytes()); + return getMD5(data.getBytes()); + } + + /** + * MD5加密 + * + * @param data 明文字符串 + * @param salt 盐 + * @return 密文 + */ + public static String getMD5(String data, String salt) { + return bytes2Hex(encryptMD5((data + salt).getBytes())); } /** @@ -36,10 +44,21 @@ public class EncryptUtils { * @return 密文 */ public static String getMD5(byte[] data) { - if (data.length > 0) { - return bytes2Hex(encryptMD5(data)); - } - return ""; + return bytes2Hex(encryptMD5(data)); + } + + /** + * MD5加密 + * + * @param data 明文字节数组 + * @param salt 盐字节数组 + * @return 密文 + */ + public static String getMD5(byte[] data, byte[] salt) { + byte[] dataSalt = new byte[data.length + salt.length]; + System.arraycopy(data, 0, dataSalt, 0, data.length); + System.arraycopy(salt, 0, dataSalt, data.length, salt.length); + return bytes2Hex(encryptMD5(dataSalt)); } /** @@ -49,19 +68,16 @@ public class EncryptUtils { * @return 密文字节数组 */ public static byte[] encryptMD5(byte[] data) { - if (data.length > 0) { - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - md.update(data); - return md.digest(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(data); + return md.digest(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); } - return null; + return new byte[0]; } - /** * 获取文件的MD5校验码 * @@ -69,62 +85,56 @@ public class EncryptUtils { * @return 文件的MD5校验码 */ public static String getMD5File(String filePath) { - if (!TextUtils.isEmpty(filePath)) { - FileInputStream in = null; - try { - MessageDigest md = MessageDigest.getInstance("MD5"); - in = new FileInputStream(filePath); - int len; - byte[] buffer = new byte[1024]; - while ((len = in.read(buffer)) != -1) { - md.update(buffer, 0, len); - } - return bytes2Hex(md.digest()); - } catch (NoSuchAlgorithmException | IOException e) { - e.printStackTrace(); - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException ignored) { - } + FileInputStream in = null; + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + in = new FileInputStream(filePath); + int len; + byte[] buffer = new byte[1024]; + while ((len = in.read(buffer)) != -1) { + md.update(buffer, 0, len); + } + return bytes2Hex(md.digest()); + } catch (NoSuchAlgorithmException | IOException e) { + e.printStackTrace(); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException ignored) { } } } return ""; } + /** + * SHA加密 + * + * @param data 明文字符串 + * @return 密文 + */ + public static String getSHA(String data) { + return getSHA(data.getBytes()); + } -/** - * SHA加密 - * - * @param data 明文 - * @return 密文 - */ -public static String getSHA(String data) { - return TextUtils.isEmpty(data) ? "" : getSHA(data.getBytes()); -} - -/** - * SHA加密 - * - * @param data 明文字节数组 - * @return 密文 - */ -public static String getSHA(byte[] data) { - if (data.length > 0) { + /** + * SHA加密 + * + * @param data 明文字节数组 + * @return 密文 + */ + public static String getSHA(byte[] data) { return bytes2Hex(encryptSHA(data)); } - return ""; -} -/** - * SHA加密 - * @param data 明文字节数组 - * @return 密文字节数组 - */ -public static byte[] encryptSHA(byte[] data) { - if (data.length > 0) { + /** + * SHA加密 + * + * @param data 明文字节数组 + * @return 密文字节数组 + */ + public static byte[] encryptSHA(byte[] data) { try { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(data); @@ -132,10 +142,8 @@ public static byte[] encryptSHA(byte[] data) { } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } + return new byte[0]; } - return null; -} - /** * 一个byte转为2个hex字符 diff --git a/androidframework/src/main/java/com/blankj/androidframework/utils/NetworkUtils.java b/androidframework/src/main/java/com/blankj/androidframework/utils/NetworkUtils.java index d2d17f15..361dc29c 100644 --- a/androidframework/src/main/java/com/blankj/androidframework/utils/NetworkUtils.java +++ b/androidframework/src/main/java/com/blankj/androidframework/utils/NetworkUtils.java @@ -80,7 +80,7 @@ public class NetworkUtils { * 获取手机连接的网络类型(2G,3G,4G) *

联通的3G为UMTS或HSDPA,移动和联通的2G为GPRS或EGDE,电信的2G为CDMA,电信的3G为EVDO */ - public static int getNetworkType(Context context) { + public static int getNetworkTpye(Context context) { TelephonyManager tm = (TelephonyManager) context .getSystemService(Context.TELEPHONY_SERVICE); switch (tm.getNetworkType()) { diff --git a/update_log.md b/update_log.md index f26da1b0..ba022785 100644 --- a/update_log.md +++ b/update_log.md @@ -7,4 +7,5 @@ #### 2016/08/02 wifi设置界面bug修复,注释排版还在修改,获取mac地址增加判空,新增QQ群:74721490,欢迎加入 #### 2016/08/02 新增隐藏状态栏,注释更加全面,工具类已封装,写的时候真的是一个一个测试过去的,宝宝心里苦 #### 2016/08/03 修复在onCreate中获取view尺寸的bug,MD5和SHA的Bug修复完成(在此感谢ssyijiu) -#### 2016/08/04 新增时间工具类(在此感谢yi520000给的补充),手机正则分简单和精确(在此感谢MIkeeJY),新增判断是否锁屏,注释使用

分段落 \ No newline at end of file +#### 2016/08/04 新增时间工具类(在此感谢yi520000给的补充),手机正则分简单和精确(在此感谢MIkeeJY),新增判断是否锁屏,注释使用

分段落,目录按首字母排序 +#### 2016/08/05 加密新增MD5盐加密,完善NetworkUtils -- GitLab