《Android使用OKhttp3实现登录注册功能+springboot搭建后端》这篇教程介绍了登录注册的流程及基本实现。但是有一些小问题。就是后端处理的时候,URL将用户名密码使用明文加密。这样抓包就很容易获取隐私数据。这篇完善这个问题。例如这个网站,我们进行抓包获取到请求,这里的密码是加密的。

加密算法分为对称加密和非对称加密。这里我们就简单介绍如何使用加密算法来实现这个功能(主要强调的是流程)。

一、Android前端

这里使用AES对称加密算法

1、创建AESHelper.java

import java.io.UnsupportedEncodingException;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
///** AES对称加密解密类 **/
public class AESHelper {// /** 算法/模式/填充 **/private static final String CipherMode = "AES/ECB/PKCS5Padding";///** 创建密钥 **/private static SecretKeySpec createKey(String password) {byte[] data = null;if (password == null) {password = "";}StringBuffer sb = new StringBuffer(32);sb.append(password);while (sb.length() < 32) {sb.append("0");}if (sb.length() > 32) {sb.setLength(32);}try {data = sb.toString().getBytes("UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return new SecretKeySpec(data, "AES");}// /** 加密字节数据 **/public static byte[] encrypt(byte[] content, String password) {try {SecretKeySpec key = createKey(password);System.out.println(key);Cipher cipher = Cipher.getInstance(CipherMode);cipher.init(Cipher.ENCRYPT_MODE, key);byte[] result = cipher.doFinal(content);return result;} catch (Exception e) {e.printStackTrace();}return null;}///** 加密(结果为16进制字符串) **/public static String encrypt(String content, String password) {byte[] data = null;try {data = content.getBytes("UTF-8");} catch (Exception e) {e.printStackTrace();}data = encrypt(data, password);String result = byte2hex(data);return result;}// /** 解密字节数组 **/public static byte[] decrypt(byte[] content, String password) {try {SecretKeySpec key = createKey(password);Cipher cipher = Cipher.getInstance(CipherMode);cipher.init(Cipher.DECRYPT_MODE, key);byte[] result = cipher.doFinal(content);return result;} catch (Exception e) {e.printStackTrace();}return null;}///** 解密16进制的字符串为字符串 **/public static String decrypt(String content, String password) {byte[] data = null;try {data = hex2byte(content);} catch (Exception e) {e.printStackTrace();}data = decrypt(data, password);if (data == null)return null;String result = null;try {result = new String(data, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return result;}// /** 字节数组转成16进制字符串 **/public static String byte2hex(byte[] b) { // 一个字节的数,StringBuffer sb = new StringBuffer(b.length * 2);String tmp = "";for (int n = 0; n < b.length; n++) {// 整数转成十六进制表示tmp = (java.lang.Integer.toHexString(b[n] & 0XFF));if (tmp.length() == 1) {sb.append("0");}sb.append(tmp);}return sb.toString().toUpperCase(); // 转成大写}// /** 将hex字符串转换成字节数组 **/private static byte[] hex2byte(String inputString) {if (inputString == null || inputString.length() < 2) {return new byte[0];}inputString = inputString.toLowerCase();int l = inputString.length() / 2;byte[] result = new byte[l];for (int i = 0; i < l; ++i) {String tmp = inputString.substring(2 * i, 2 * i + 2);result[i] = (byte) (Integer.parseInt(tmp, 16) & 0xFF);}return result;}
}

2、修改MainActivity.java

这里修改login方案的算法

public void login(View view) {loginUser = new LoginUser();loginUser.setUserName(username.getText().toString());loginUser.setUserPassword(password.getText().toString());new Thread(new Runnable() {@Overridepublic void run() {MediaType JSON = MediaType.parse("application/json;charset=utf-8");JSONObject jsonObject = new JSONObject();OkHttpClient httpClient = new OkHttpClient();try {jsonObject.put("userName",loginUser.getUserName());jsonObject.put("userPassword",loginUser.getUserPassword());} catch (JSONException e) {e.printStackTrace();}//7.29 对数组进行加密解密,后端解密,前端加密,秘钥为"key",这里的key自行设定与后端对应即可;String encrypt = AESHelper.encrypt(jsonObject.toString(), "key");//                RequestBody requestBody = RequestBody.create(JSON, String.valueOf(jsonObject));RequestBody requestBody = RequestBody.create(JSON, encrypt);Log.d("前端测试发送的jsonObject:",jsonObject.toString());Log.d("encrypt:",encrypt);Log.d("前端测试发送的requestBody:",requestBody.toString());
//                String url = "http://ip:8001/server/user/login";String url = "http://ip:8001/server/user/loginaes";Request request = new Request.Builder().url(url).post(requestBody).build();Log.d("前端测试发送的request:",request.toString());Call call = httpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {Log.d("whq登录","失败了");}@Overridepublic void onResponse(Call call, Response response) throws IOException {String MyResult = response.body().string();/*  Gson gson = new GsonBuilder().create();ResultGson resultGson = gson.fromJson(MyResult, ResultGson.class);Log.d("whq登录",resultGson.getData().get("result")+"---------resultGson---------");Log.d("whq登录",resultGson.toString()+"---------resultGson---------");*//* Log.d("whq登录","----------------------------");Map<String, Object> data = new HashMap<String, Object>();data.put("result","success login");ResultGson json = new ResultGson(true, 20000, "成功", data);Log.d("原始json",json.toString());Gson gson1 = new GsonBuilder().create();String toJson = gson1.toJson(json);Log.d("转化之后的json",toJson);*/Log.d("whq登录",response+"---------response---------");Log.d("whq登录",response.message()+"---------message---------");Log.d("whq登录",response.body().toString()+"------------------");Log.d("whq登录",MyResult+"-----------MyResult-------");Log.d("whq登录",MyResult.contains("success login")+"-----------MyResult.length()-------");}});}}).start();}

注意这里修改了三处地方:

//7.29 对数组进行加密解密,后端解密,前端加密,秘钥为key;
String encrypt = AESHelper.encrypt(jsonObject.toString(), "key");
//RequestBody requestBody = RequestBody.create(JSON, String.valueOf(jsonObject));
RequestBody requestBody = RequestBody.create(JSON, encrypt);
//String url = "http://ip:8001/server/user/login";
String url = "http://ip:8001/server/user/loginaes";

将json加密成字符串,这里的key自行设定,需要与后端对应解密。使用新的URL请求地址。这样前端就修改完成,就是这么简单。

二、服务器后端

1、创建AESHelper.java类

这个类与Android端的工具类一样,复制过来就行。

1、修改UserController.java

    @PostMapping("loginaes")public R loginAES(@RequestBody String Aes){String decrypt = AESHelper.decrypt(Aes,"key");System.out.println("decrypt"+decrypt);Gson gson = new GsonBuilder().create();loginUser loginUser = gson.fromJson(decrypt, loginUser.class);System.out.println("loginUser"+loginUser.toString());System.out.println("loginUser"+loginUser);String token = userService.login(loginUser);if (token == "wrong Password"){return R.error().data("result",token);}else{return R.ok().data("result",token);}}

这里重新修改接口,定义一个loginaes的接口,将参数先解密,这里的key要对应起来,由于是字符串,我们需要将字符串转为json,这里使用GSon工具,具体介绍看这篇文章《Android解析json-Gson使用》,这里还要有一个loginUser的实体类
loginUser.java

@Data
public class loginUser {private String userName;private String userPassword;
}

其他的地方不需要改动。

三、启动项目

使用maven将项目打包部署在服务器上,参考之前的教程,安装APP进行调试

抓包:

这样就解决了明文传送。当然还可以使用其他的非对称加密算法,生成双钥就可以了(比如RSA算法)。也可以继续改进加密的功能,这里只是粗略的介绍一下思想。

Android登录注册功能加密处理相关推荐

  1. Android登录注册功能封装

    我们都知道Android应用软件基本上都会用到登录注册功能,那么对一个一个好的登录注册模块进行封装就势在必行了.这里给大家介绍一下我的第一个项目中所用到的登录注册功能的,已经对其进行封装,希望能对大家 ...

  2. 在线登录注册功能(android客户端+javaweb服务端+腾讯云服务器+腾讯云数据库)

    在线登录注册功能(android客户端+javaweb服务端+腾讯云服务器+腾讯云数据库) 完整的项目已上传github仓库,链接在文章最下面 注:笔者在安卓客户端部分写了kotlin语言和java语 ...

  3. android如何实现用户注册功能,Android 实现简单的登录注册功能(SharedPreferences和SQLite)...

    最近恰好作了一个Android的登陆注册界面,将数据利用SharedPreferences或者SQLite绑定到Android程序中,实现简单的登录注册功能,本文未涉及到与服务器的交流.java 首先 ...

  4. 基于android校园订餐APP,简单实现登录注册功能(SharedPreferences)

    基于android校园订餐APP,简单实现登录注册功能(SharedPreferences) 欢迎浏览本篇文章 界面效果图 页面设计代码 源代码 欢迎浏览本篇文章 大家好! 这是小编首次在博客上写的文 ...

  5. html登陆注册功能实现,实现用户的登录注册功能

    在基于Spring Boot框架上,实现用户的登录注册功能, 首先分析前期所需要的规划. 1 实现登录注册 前端向后端发起post请求 2用户密码安全性 密码是不推荐明文入库的,在后台采取秘钥加加不可 ...

  6. Axure实战——实现登录注册功能

    背景 在做系分项目原型的时候,我需要做一个简单的登录注册模块.但要实现这个功能,只是看我之前写的博客中的相关教程是远远不够的.因此,我需要重新开始摸索,便有了这篇博客. 为了完成该功能,我们需要用到两 ...

  7. 安卓通过SQLite实现登录注册功能(小白式教程)

    安卓通过SQLlite实现登录注册功能 前面基本操作看图片 第一个xml文件是:round_bg.xml,后面界面布局要用到 <?xml version="1.0" enco ...

  8. Vue项目二 登录注册功能的实现

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.系统注册功能的实现 1.配置注册页面路由 2.注册页面的搭建 3.api下发送ajax请求的文件创建 二.后台数据 ...

  9. Spring boot 搭建个人博客系统(二)——登录注册功能

    Spring boot 搭建个人博客系统(二)--登录注册功能 一直想用Spring boot 搭建一个属于自己的博客系统,刚好前段时间学习了叶神的牛客项目课受益匪浅,乘热打铁也主要是学习,好让自己熟 ...

最新文章

  1. linux 别名管理,Linux 的 15 个命令行别名, 帮系统管理员提升工作效率!
  2. Linux: I/O多路转接之poll(有图有代码有真相!!!)
  3. 华睿相机sdk 开发_索尼发布相机远程操作SDK(软件开发工具包)
  4. 【2016年第3期】中国电信大数据应用实践
  5. bp神经网络预测模型_【2020顶会KDD】AutoST:面向时空预测的高效神经网络学习模型...
  6. [cocos2dx]斗地主随机发牌界面生成
  7. 敏感词检测软件-在线敏感词批量检测免费
  8. mysql to double_double todouble
  9. 工厂模式-汽车工厂案例(附代码)
  10. CSS:transform应用之立体魔方案例
  11. 买电脑常识——电脑性能
  12. CSS基础五(盒模型)
  13. 有n个人围成一圈编号1~n,顺序排好,从第一个人开始1到3报数,凡是报到3的人退出圈子,C语言编程出圈顺序
  14. TextView描边、渐变、阴影效果
  15. 在手机屏幕上移动APP的两种方式
  16. Unity3d之表情动画--眨眼
  17. 语音和面部识别技术能帮助AI在情商上超越人类吗
  18. 微软kestrel服务器开启,用微软的kestrel在Linux上利用Apache架设Asp.Net Core环境
  19. 中国航信2020java校招笔试题_航信校招java笔试题
  20. SpringBoot教程目录

热门文章

  1. [置顶]人工智能(深度学习)加速芯片论文阅读笔记 (已添加ISSCC17,FPGA17...ISCA17...)...
  2. 拿下T3出行百台Robotaxi订单,这家无人驾驶公司有啥“硬实力”
  3. C语言编译的作用是什么,C语言代码编译后是什么?
  4. 微信小程序最新研究报告,带你深度解读小程序的边界
  5. mysql alter table delete column_MySQL 添加列,修改列,删除列 详细说明
  6. POI-TL导出Word文档(支持WPS查看)
  7. 用计算机怎么成绩排名,excel表中如何成绩排名,excel表怎么排名
  8. 1篇文章讲透yolo v1-v7
  9. 微信小程序开发自学笔记 —— 七、性能优化
  10. 京东卖点图怎么修改,批量修改卖点图教程