提交 7f48af50 编写于 作者: C cmj

加密新增MD5盐加密,完善NetworkUtils

上级 45a79e49
# 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),新增判断是否锁屏,注释使用<p>分段落,目录按首字母排序
#### 2016/08/05 加密新增MD5盐加密,完善NetworkUtils
##[关于Blankj](http://blankj.com/about)
\ No newline at end of file
......@@ -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);
}
```
......@@ -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();
}
/**
* 判断网络是否可用
* <p>需添加权限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
*/
public static boolean isAvailable(Context context) {
NetworkInfo info = getActiveNetworkInfo(context);
return info != null && info.isAvailable();
}
```
### 判断网络是否连接
``` java
/**
* 判断网络是否连接
* <p>需添加权限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
*/
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
* <p>需添加权限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
*/
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
/**
* 获取移动终端类型
* <pre>
* PHONE_TYPE_NONE : 0 手机制式未知
* PHONE_TYPE_GSM : 1 手机制式为GSM,移动和联通
* PHONE_TYPE_CDMA : 2 手机制式为CDMA,电信
* PHONE_TYPE_SIP : 3
* <pre/>
*
* @return 手机制式
* <ul>
* <li>PHONE_TYPE_NONE : 0 手机制式未知</li>
* <li>PHONE_TYPE_GSM : 1 手机制式为GSM,移动和联通</li>
* <li>PHONE_TYPE_CDMA : 2 手机制式为CDMA,电信</li>
* <li>PHONE_TYPE_SIP : 3</li>
* </ul>
*/
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)
* <p>联通的3G为UMTS或HSDPA,移动和联通的2G为GPRS或EGDE,电信的2G为CDMA,电信的3G为EVDO
* 获取当前的网络类型(WIFI,2G,3G,4G)
* <p>需添加权限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
*
* @return 网络类型
* <ul>
* <li>NETWORK_WIFI = 1;</li>
* <li>NETWORK_4G = 4;</li>
* <li>NETWORK_3G = 3;</li>
* <li>NETWORK_2G = 2;</li>
* <li>NETWORK_UNKNOWN = 5;</li>
* <li>NETWORK_NO = -1;</li>
* </ul>
*/
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)
* <p>需添加权限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
* 需要用到上面的方法
* 获取当前的网络类型(WIFI,2G,3G,4G)
* 依赖上面的方法
*
* @param context
* @return 网络类型名称
* <ul>
* <li>NETWORK_WIFI </li>
* <li>NETWORK_4G </li>
* <li>NETWORK_3G </li>
* <li>NETWORK_2G </li>
* <li>NETWORK_UNKNOWN</li>
* <li>NETWORK_NO </li>
* </ul>
*/
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;
}
```
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字符
......
......@@ -80,7 +80,7 @@ public class NetworkUtils {
* 获取手机连接的网络类型(2G,3G,4G)
* <p>联通的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()) {
......
......@@ -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),新增判断是否锁屏,注释使用<p>分段落
\ No newline at end of file
#### 2016/08/04 新增时间工具类(在此感谢yi520000给的补充),手机正则分简单和精确(在此感谢MIkeeJY),新增判断是否锁屏,注释使用<p>分段落,目录按首字母排序
#### 2016/08/05 加密新增MD5盐加密,完善NetworkUtils
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册