【RSA】和【AES】加密

网络请求是数据的传递使用了【RSA】和【AES】加密

需要使用用户信息的请求使用AES加密(需要秘钥进行加密)
与用户无关联的请求使用RSA加密

rsa加密
/**

  • 进行rsa加密

  • @param data 加密数据

  • @return 加密结果
    */
    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、将需要传递的数据转换拼接成json字符串,jb.put("phoneNum", phoneNum);
2、然后将json字符串转换成byte数组,data.getBytes()
3、将byte数组进行rsa加密,RSAJava.encryptByPublicKey(data.getBytes())
4、加密后的byte数组进行Base64转码并转成字符串形式,Base64.encodeToString(encryptByte,Base64.DEFAULT)
5、将得到的字符串放入hashmap中key为data,value为加密处理后的字符串,mapList.put("data", encryptByPublicKey(jb.toString()));
6、将加密后的map遍历,使用stringBuffer.append("&" + str + "=" + value)
7、post请求
// 实例化 StringRequest类
StringRequest stringRequest = new StringRequest(Request.Method.POST,
httpData.getUrl(), new Listener<String>() {.........
// 设置请求时间
VolleyUtil.setTimeOutRequest(stringRequest, mCurrentTimeoutMs);
// 发送请求
VolleyUtil.addRequest(stringRequest, httpData.getUrlTag());
8、get请求
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(conUrl,
null, new Response.Listener<JSONObject>() {
// 设置请求时间
VolleyUtil.setTimeOutRequest(jsonObjectRequest, mCurrentTimeoutMs);
// 发送请求
VolleyUtil.addRequest(jsonObjectRequest, httpData.getUrlTag());

/**

  • 获取验证码

  • @return map集合

  • sendType 1注册 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 以便销毁时 取消请求的url
    */
    private String getTag(HashMap<String, String> map, String url,
    String action) {
    // 请求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、将需要传递的数据转换拼接成json字符串,jb.put("addressBook", addressBook);
2、将json转换成字符串jb.toString()
3、根据用户的加密串(用户登录成功之后才会有加密串,即秘钥SecretKey),将data字符串进行AES加密
4、将加密之后的byte数组使用Base64编码进行转码,得到字符串

/**

  • 进行aes加密
  • @param data 加密数据
  • @return 加密结果
    */
    public static String encryptByAES(String data) {
    byte[] encryptByte = AESUtils.encrypt(UserManagerImpl.getInstance().getJKUser()
    .getSecretKey(), data);
    String afterencrypt = Base64.encodeToString(encryptByte,
    Base64.DEFAULT);
    return afterencrypt;

}

/**

  • 上传联系人接口

  • @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;
    }

--------------------------------------------------------分割线-------------------------------------------------------------------
接口返回结果时,
1、先对data数据进行Base64转码,
2、然后再Rsa解码RSAJava.decryptByPublicKey
@Override
public synchronized void onResponse(String response) {
LogUtils.e("TAG", response.toString());
httpData.disposeResult(response.toString());
httpData.getListener().onSuccess(httpData);
}

/**

  • 获取是否请求成功 并提示信息

  • @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("无效token")) {
    
             ToastManager.getInstance(VApplication.getApplication()).show("登录失败,请重新登录");
             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("无效token")) {
                 //不显示无效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("返回解密结果" + getAction(), getJsonData());
    

    } catch (Exception e) {
    LogUtils.e(e.toString());
    ToastManager.getInstance(VApplication.getApplication()).show("请求失败");
    setSuccess(false);
    }
    }

/**

  • 解析接口返回的data数据

  • @param data

  • @return
    */
    public static String parsingResultData(String data) {
    try {
    // RSA解密返回的 data数据
    byte[] decryptByPublicKey = RSAJava.decryptByPublicKey(Base64Utils
    .decode(data));

     return new String(decryptByPublicKey);
    

    } catch (Exception e) {
    return "";
    }
    }

--------------------------------------------------------分割线-------------------------------------------------------------------
用户登录(使用AES时需要的加密串,登陆成功后会返回)

1、在activity中获得用户输入的用户名和密码调用登录方法,userManager.doLogin(this, sPhone, sPassword);
2、设置登录参数user = JKUser.createInstance(userName, userPassword);
3、用户名和密码转换成json串,然后转换成Byte数组
4、将Byte数组用RSA加密,给加密byte串赋值
5、将加密byte串进行Base64编码转换成字符串,给加密String串赋值
6、将加密后的String串放入hashMap数组中,key为data,值为加密string串
7、然后post请求登录接口
VYHttpData httpData = new VYHttpData(URL_AUTH, mapList, LOGIN_ACTION, this);
mVYHttpUtils.postHttpResult(httpData);
8、post请求
// 实例化 StringRequest类
StringRequest stringRequest = new StringRequest(Request.Method.POST,
httpData.getUrl(), new Listener<String>() {.........
// 设置请求时间
VolleyUtil.setTimeOutRequest(stringRequest, mCurrentTimeoutMs);
// 发送请求
VolleyUtil.addRequest(stringRequest, httpData.getUrlTag());

9、得到RSA解密后的data json对象,得到秘钥secretKey,登录的token
10、token字符串先进行Base64转码
11、再使用secretKey将token进行aes解码得到字符串decrypt
String decrypt = AESUtils.decrypt(secretKey,Base64.decode(token, Base64.DEFAULT));
12、再将解密后的字符串decrypt进行base64转码得到字符串token(解密之后的token)
13、将token,secretKey,username,password存到本地做用户的数据缓存
14、给用户Token和secretKey进行赋值,
user.setToken(sToken);
user.setSecretKey(secretKey);
15、登录成功EventBus发送已登录事件

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) {
//设置登录参数
user = JKUser.createInstance(userName, userPassword);

if (user == null) {
    return false;
} else {
    //弹出进度框
    baseActivity = null;
    baseActivity = activity;
    if (baseActivity != null) {
        baseActivity.showXProgressDialog();
    }
    HashMap<String, String> mapList = new HashMap<String, String>();
    mapList.put("data", user.getAfterencrypt());
    //请求登录接口
    VYHttpData httpData = new VYHttpData(URL_AUTH, mapList, LOGIN_ACTION, this);
    mVYHttpUtils.postHttpResult(httpData);
    return true;
}

}

/**

  • 登录成功

  • @param httpData 请求接口封装类
    */
    @Override
    public void onSuccess(VYHttpData httpData) {

    if (httpData.getAction().equals(LOGIN_ACTION)) {
    //登录成功,进度圈消失
    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数据
             String sToken = new String(Base64Utils.decode(decrypt));
             // 做用户数据的缓存 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发送已登录事件
             EventBus.getDefault().post(new UserLoginEvent().setUser(user));
             ToastManager.getInstance(JiuKeApplication.getApplication()).show("登录成功");
         }
     } catch (Exception e) {
         ToastManager.getInstance(JiuKeApplication.getApplication()).show("登录异常");
     }
    

    }
    }

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 网络安全RSA加密机制服务器与客户端进行HTTP通讯时,常常会被网络抓包、反编译(如iOS中常用搞得青花瓷)等技术...
    嗯o哼阅读 1,265评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • 概述 之前一直对加密相关的算法知之甚少,只知道类似DES、RSA等加密算法能对数据传输进行加密,且各种加密算法各有...
    Henryzhu阅读 3,011评论 0 14
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • 如果只是单单的申请MFI开发许可证,那就很简单。因为可以自己去设计和开发MFI配件出来,交给有MFI制造许可的厂家...
    AlanAnie阅读 456评论 0 0