網(wǎng)絡(luò)請(qǐng)求是數(shù)據(jù)的傳遞使用了【RSA】和【AES】加密
需要使用用戶信息的請(qǐng)求使用AES加密(需要秘鑰進(jìn)行加密)
與用戶無(wú)關(guān)聯(lián)的請(qǐng)求使用RSA加密
rsa加密
/**
進(jìn)行rsa加密
@param data 加密數(shù)據(jù)
-
@return 加密結(jié)果
*/
public static String encryptByPublicKey(String data) {try {
// 加密
byte[] encryptByte = RSAJava.encryptByPublicKey(data.getBytes());
String afterencrypt = Base64.encodeToString(encryptByte,
Base64.DEFAULT);
return afterencrypt;
} catch (Exception e) {
return "";
}
}
使用:
1、將需要傳遞的數(shù)據(jù)轉(zhuǎn)換拼接成json字符串,jb.put("phoneNum", phoneNum);
2、然后將json字符串轉(zhuǎn)換成byte數(shù)組,data.getBytes()
3、將byte數(shù)組進(jìn)行rsa加密,RSAJava.encryptByPublicKey(data.getBytes())
4、加密后的byte數(shù)組進(jìn)行Base64轉(zhuǎn)碼并轉(zhuǎn)成字符串形式,Base64.encodeToString(encryptByte,Base64.DEFAULT)
5、將得到的字符串放入hashmap中key為data,value為加密處理后的字符串,mapList.put("data", encryptByPublicKey(jb.toString()));
6、將加密后的map遍歷,使用stringBuffer.append("&" + str + "=" + value)
7、post請(qǐng)求
// 實(shí)例化 StringRequest類
StringRequest stringRequest = new StringRequest(Request.Method.POST,
httpData.getUrl(), new Listener<String>() {.........
// 設(shè)置請(qǐng)求時(shí)間
VolleyUtil.setTimeOutRequest(stringRequest, mCurrentTimeoutMs);
// 發(fā)送請(qǐng)求
VolleyUtil.addRequest(stringRequest, httpData.getUrlTag());
8、get請(qǐng)求
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(conUrl,
null, new Response.Listener<JSONObject>() {
// 設(shè)置請(qǐng)求時(shí)間
VolleyUtil.setTimeOutRequest(jsonObjectRequest, mCurrentTimeoutMs);
// 發(fā)送請(qǐng)求
VolleyUtil.addRequest(jsonObjectRequest, httpData.getUrlTag());
/**
獲取驗(yàn)證碼
@return map集合
-
sendType 1注冊(cè) 2充值
*/
public static HashMap<String, String> getPhoneCodeParams(String phoneNum, String sendType) {
HashMap<String, String> mapList = new HashMap<String, String>();try {
JSONObject jb = new JSONObject();
jb.put("phoneNum", phoneNum);
jb.put("sendType", sendType);
mapList.put("data", encryptByPublicKey(jb.toString()));
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}return mapList;
}
/**
- 添加url tag 以便銷毀時(shí) 取消請(qǐng)求的url
*/
private String getTag(HashMap<String, String> map, String url,
String action) {
// 請(qǐng)求url集合
long currentTimeMillis = System.currentTimeMillis();
StringBuffer stringBuffer = new StringBuffer();
for (String str : map.keySet()) {
final String value = map.get(str);
stringBuffer.append("&" + str + "=" + value);
}
String tag = action + currentTimeMillis + stringBuffer.toString();
return tag;
}
--------------------------------------------------------分割線-------------------------------------------------------------------
aes加密
使用:
1、將需要傳遞的數(shù)據(jù)轉(zhuǎn)換拼接成json字符串,jb.put("addressBook", addressBook);
2、將json轉(zhuǎn)換成字符串jb.toString()
3、根據(jù)用戶的加密串(用戶登錄成功之后才會(huì)有加密串,即秘鑰SecretKey),將data字符串進(jìn)行AES加密
4、將加密之后的byte數(shù)組使用Base64編碼進(jìn)行轉(zhuǎn)碼,得到字符串
/**
- 進(jìn)行aes加密
- @param data 加密數(shù)據(jù)
- @return 加密結(jié)果
*/
public static String encryptByAES(String data) {
byte[] encryptByte = AESUtils.encrypt(UserManagerImpl.getInstance().getJKUser()
.getSecretKey(), data);
String afterencrypt = Base64.encodeToString(encryptByte,
Base64.DEFAULT);
return afterencrypt;
}
/**
上傳聯(lián)系人接口
-
@param addressBook
*/
public static HashMap<String, String> getAddressBook(String addressBook) {
HashMap<String, String> mapList = new HashMap<String, String>();try {
JSONObject jb = new JSONObject();
jb.put("addressBook", addressBook);
LogUtils.e(jb.toString());
mapList.put("data", encryptByAES(jb.toString()));} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}return mapList;
}
--------------------------------------------------------分割線-------------------------------------------------------------------
接口返回結(jié)果時(shí),
1、先對(duì)data數(shù)據(jù)進(jìn)行Base64轉(zhuǎn)碼,
2、然后再Rsa解碼RSAJava.decryptByPublicKey
@Override
public synchronized void onResponse(String response) {
LogUtils.e("TAG", response.toString());
httpData.disposeResult(response.toString());
httpData.getListener().onSuccess(httpData);
}
/**
獲取是否請(qǐng)求成功 并提示信息
@param str
-
@return
*/
public void disposeResult(String str) {
try {
setResponse(str);
JSONObject jsonObject = new JSONObject(str);if (jsonObject.optString("result").equals("103")) { if (jsonObject.optString("errorInfo").equals("無(wú)效token")) { ToastManager.getInstance(VApplication.getApplication()).show("登錄失敗,請(qǐng)重新登錄"); VApplication.getApplication().isInvalidToken(); setSuccess(false); } } if (!jsonObject.optString("result").equals("0")) { String msg = jsonObject.optString("msg"); if (TextUtils.isEmpty(msg)) { if (jsonObject.optString("errorInfo").equals("無(wú)效token")) { //不顯示無(wú)效token } else { msg = jsonObject.optString("errorInfo"); ToastManager.getInstance(VApplication.getApplication()).show(msg); } } else { ToastManager.getInstance(VApplication.getApplication()).show(msg); } setSuccess(false); } else { setSuccess(true); } setJsonData(VYSystemUtils.parsingResultData(jsonObject .optString("data"))); LogUtils.e("返回解密結(jié)果" + getAction(), getJsonData());} catch (Exception e) {
LogUtils.e(e.toString());
ToastManager.getInstance(VApplication.getApplication()).show("請(qǐng)求失敗");
setSuccess(false);
}
}
/**
解析接口返回的data數(shù)據(jù)
@param data
-
@return
*/
public static String parsingResultData(String data) {
try {
// RSA解密返回的 data數(shù)據(jù)
byte[] decryptByPublicKey = RSAJava.decryptByPublicKey(Base64Utils
.decode(data));return new String(decryptByPublicKey);} catch (Exception e) {
return "";
}
}
--------------------------------------------------------分割線-------------------------------------------------------------------
用戶登錄(使用AES時(shí)需要的加密串,登陸成功后會(huì)返回)
1、在activity中獲得用戶輸入的用戶名和密碼調(diào)用登錄方法,userManager.doLogin(this, sPhone, sPassword);
2、設(shè)置登錄參數(shù)user = JKUser.createInstance(userName, userPassword);
3、用戶名和密碼轉(zhuǎn)換成json串,然后轉(zhuǎn)換成Byte數(shù)組
4、將Byte數(shù)組用RSA加密,給加密byte串賦值
5、將加密byte串進(jìn)行Base64編碼轉(zhuǎn)換成字符串,給加密String串賦值
6、將加密后的String串放入hashMap數(shù)組中,key為data,值為加密string串
7、然后post請(qǐng)求登錄接口
VYHttpData httpData = new VYHttpData(URL_AUTH, mapList, LOGIN_ACTION, this);
mVYHttpUtils.postHttpResult(httpData);
8、post請(qǐng)求
// 實(shí)例化 StringRequest類
StringRequest stringRequest = new StringRequest(Request.Method.POST,
httpData.getUrl(), new Listener<String>() {.........
// 設(shè)置請(qǐng)求時(shí)間
VolleyUtil.setTimeOutRequest(stringRequest, mCurrentTimeoutMs);
// 發(fā)送請(qǐng)求
VolleyUtil.addRequest(stringRequest, httpData.getUrlTag());
9、得到RSA解密后的data json對(duì)象,得到秘鑰secretKey,登錄的token
10、token字符串先進(jìn)行Base64轉(zhuǎn)碼
11、再使用secretKey將token進(jìn)行aes解碼得到字符串decrypt
String decrypt = AESUtils.decrypt(secretKey,Base64.decode(token, Base64.DEFAULT));
12、再將解密后的字符串decrypt進(jìn)行base64轉(zhuǎn)碼得到字符串token(解密之后的token)
13、將token,secretKey,username,password存到本地做用戶的數(shù)據(jù)緩存
14、給用戶Token和secretKey進(jìn)行賦值,
user.setToken(sToken);
user.setSecretKey(secretKey);
15、登錄成功EventBus發(fā)送已登錄事件
public static JKUser createInstance(String userName, String userPassword) {
JKUser user = null;
try {
user = new JKUser();
user.setUserName(userName);
user.setUserPassword(userPassword);
JSONObject jb = new JSONObject();
jb.put("userName", userName);
jb.put("userPassword", userPassword);
user.setEncryptByte(RSAJava.encryptByPublicKey(jb.toString()
.getBytes()));
user.setAfterencrypt(Base64.encodeToString(user.getEncryptByte(),
Base64.DEFAULT));
} catch (Exception e) {
LogUtils.e("log", e.toString());
}
return user;
}
@Override
public boolean doLogin(BaseActivity activity, String userName, String userPassword) {
//設(shè)置登錄參數(shù)
user = JKUser.createInstance(userName, userPassword);
if (user == null) {
return false;
} else {
//彈出進(jìn)度框
baseActivity = null;
baseActivity = activity;
if (baseActivity != null) {
baseActivity.showXProgressDialog();
}
HashMap<String, String> mapList = new HashMap<String, String>();
mapList.put("data", user.getAfterencrypt());
//請(qǐng)求登錄接口
VYHttpData httpData = new VYHttpData(URL_AUTH, mapList, LOGIN_ACTION, this);
mVYHttpUtils.postHttpResult(httpData);
return true;
}
}
/**
登錄成功
-
@param httpData 請(qǐng)求接口封裝類
*/
@Override
public void onSuccess(VYHttpData httpData) {if (httpData.getAction().equals(LOGIN_ACTION)) {
//登錄成功,進(jìn)度圈消失
if (baseActivity != null) {
baseActivity.dismissXProgressDialog();
baseActivity = null;
}
try {
if (httpData.isSuccess()) {
JSONObject jsonData = new JSONObject(httpData.getJsonData());
String secretKey = jsonData.getString("secretKey");
String token = jsonData.getString("token");
//AES 解密
String decrypt = AESUtils.decrypt(secretKey,
Base64.decode(token, Base64.DEFAULT));// 解密之后獲取的token數(shù)據(jù) String sToken = new String(Base64Utils.decode(decrypt)); // 做用戶數(shù)據(jù)的緩存 token secretkey username if (!TextUtils.isEmpty(sToken)) { PreferencesUtils.putSharePre(JiuKeApplication.getApplication(), PreferencesUtils.USER_TOKEN, sToken); PreferencesUtils.putSharePre(JiuKeApplication.getApplication(), PreferencesUtils.USER_KEY, secretKey); PreferencesUtils.putSharePre(JiuKeApplication.getApplication(), PreferencesUtils.USER_PHONE, user.getUserName()); } user.setToken(sToken); user.setSecretKey(secretKey); //登錄成功EventBus發(fā)送已登錄事件 EventBus.getDefault().post(new UserLoginEvent().setUser(user)); ToastManager.getInstance(JiuKeApplication.getApplication()).show("登錄成功"); } } catch (Exception e) { ToastManager.getInstance(JiuKeApplication.getApplication()).show("登錄異常"); }}
}