Android登录注册功能加密处理
《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登录注册功能加密处理相关推荐
- Android登录注册功能封装
我们都知道Android应用软件基本上都会用到登录注册功能,那么对一个一个好的登录注册模块进行封装就势在必行了.这里给大家介绍一下我的第一个项目中所用到的登录注册功能的,已经对其进行封装,希望能对大家 ...
- 在线登录注册功能(android客户端+javaweb服务端+腾讯云服务器+腾讯云数据库)
在线登录注册功能(android客户端+javaweb服务端+腾讯云服务器+腾讯云数据库) 完整的项目已上传github仓库,链接在文章最下面 注:笔者在安卓客户端部分写了kotlin语言和java语 ...
- android如何实现用户注册功能,Android 实现简单的登录注册功能(SharedPreferences和SQLite)...
最近恰好作了一个Android的登陆注册界面,将数据利用SharedPreferences或者SQLite绑定到Android程序中,实现简单的登录注册功能,本文未涉及到与服务器的交流.java 首先 ...
- 基于android校园订餐APP,简单实现登录注册功能(SharedPreferences)
基于android校园订餐APP,简单实现登录注册功能(SharedPreferences) 欢迎浏览本篇文章 界面效果图 页面设计代码 源代码 欢迎浏览本篇文章 大家好! 这是小编首次在博客上写的文 ...
- html登陆注册功能实现,实现用户的登录注册功能
在基于Spring Boot框架上,实现用户的登录注册功能, 首先分析前期所需要的规划. 1 实现登录注册 前端向后端发起post请求 2用户密码安全性 密码是不推荐明文入库的,在后台采取秘钥加加不可 ...
- Axure实战——实现登录注册功能
背景 在做系分项目原型的时候,我需要做一个简单的登录注册模块.但要实现这个功能,只是看我之前写的博客中的相关教程是远远不够的.因此,我需要重新开始摸索,便有了这篇博客. 为了完成该功能,我们需要用到两 ...
- 安卓通过SQLite实现登录注册功能(小白式教程)
安卓通过SQLlite实现登录注册功能 前面基本操作看图片 第一个xml文件是:round_bg.xml,后面界面布局要用到 <?xml version="1.0" enco ...
- Vue项目二 登录注册功能的实现
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.系统注册功能的实现 1.配置注册页面路由 2.注册页面的搭建 3.api下发送ajax请求的文件创建 二.后台数据 ...
- Spring boot 搭建个人博客系统(二)——登录注册功能
Spring boot 搭建个人博客系统(二)--登录注册功能 一直想用Spring boot 搭建一个属于自己的博客系统,刚好前段时间学习了叶神的牛客项目课受益匪浅,乘热打铁也主要是学习,好让自己熟 ...
最新文章
- linux 别名管理,Linux 的 15 个命令行别名, 帮系统管理员提升工作效率!
- Linux: I/O多路转接之poll(有图有代码有真相!!!)
- 华睿相机sdk 开发_索尼发布相机远程操作SDK(软件开发工具包)
- 【2016年第3期】中国电信大数据应用实践
- bp神经网络预测模型_【2020顶会KDD】AutoST:面向时空预测的高效神经网络学习模型...
- [cocos2dx]斗地主随机发牌界面生成
- 敏感词检测软件-在线敏感词批量检测免费
- mysql to double_double todouble
- 工厂模式-汽车工厂案例(附代码)
- CSS:transform应用之立体魔方案例
- 买电脑常识——电脑性能
- CSS基础五(盒模型)
- 有n个人围成一圈编号1~n,顺序排好,从第一个人开始1到3报数,凡是报到3的人退出圈子,C语言编程出圈顺序
- TextView描边、渐变、阴影效果
- 在手机屏幕上移动APP的两种方式
- Unity3d之表情动画--眨眼
- 语音和面部识别技术能帮助AI在情商上超越人类吗
- 微软kestrel服务器开启,用微软的kestrel在Linux上利用Apache架设Asp.Net Core环境
- 中国航信2020java校招笔试题_航信校招java笔试题
- SpringBoot教程目录
热门文章
- [置顶]人工智能(深度学习)加速芯片论文阅读笔记 (已添加ISSCC17,FPGA17...ISCA17...)...
- 拿下T3出行百台Robotaxi订单,这家无人驾驶公司有啥“硬实力”
- C语言编译的作用是什么,C语言代码编译后是什么?
- 微信小程序最新研究报告,带你深度解读小程序的边界
- mysql alter table delete column_MySQL 添加列,修改列,删除列 详细说明
- POI-TL导出Word文档(支持WPS查看)
- 用计算机怎么成绩排名,excel表中如何成绩排名,excel表怎么排名
- 1篇文章讲透yolo v1-v7
- 微信小程序开发自学笔记 —— 七、性能优化
- 京东卖点图怎么修改,批量修改卖点图教程