【RSA】和【AES】加密

網(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("登錄異常");
     }
    

    }
    }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 網(wǎng)絡(luò)安全RSA加密機(jī)制服務(wù)器與客戶端進(jìn)行HTTP通訊時(shí),常常會(huì)被網(wǎng)絡(luò)抓包、反編譯(如iOS中常用搞得青花瓷)等技術(shù)...
    嗯o哼閱讀 1,311評(píng)論 0 3
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • 概述 之前一直對(duì)加密相關(guān)的算法知之甚少,只知道類似DES、RSA等加密算法能對(duì)數(shù)據(jù)傳輸進(jìn)行加密,且各種加密算法各有...
    Henryzhu閱讀 3,218評(píng)論 0 14
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,728評(píng)論 18 399
  • 如果只是單單的申請(qǐng)MFI開(kāi)發(fā)許可證,那就很簡(jiǎn)單。因?yàn)榭梢宰约喝ピO(shè)計(jì)和開(kāi)發(fā)MFI配件出來(lái),交給有MFI制造許可的廠家...
    AlanAnie閱讀 520評(píng)論 0 0

友情鏈接更多精彩內(nèi)容