Android 手机卫士--md5加密过程
在之前的文章中,我们将用户的密码使用SharedPreferences存储,我们打开/data/data/com.wuyudong.mobilesafe/shared_prefs文件夹下的 config.xml 文件,导入到本地,查看内容:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="mobile_safe_psd">123</string>
<boolean name="open_update" value="false" />
</map>
密码居然使用的是明文,这样是非常不安全的。这里采用md5加密
本文地址:http://www.cnblogs.com/wuyudong/p/5941131.html,转载请注明出处。
编写Md5Util工具类,代码如下:
package com.wuyudong.mobilesafe.Utils; /**
* Created by wuyudong on 2016/10/9.
*/ import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; public class Md5Util {
/**
* 给指定字符串按照md5算法去加密
*
* @param psd 需要加密的密码 加盐处理
* @return md5后的字符串
*/
public static String encoder(String psd) {
try {
//加盐处理
psd = psd + "mobilesafe";
//1,指定加密算法类型
MessageDigest digest = MessageDigest.getInstance("MD5");
//2,将需要加密的字符串中转换成byte类型的数组,然后进行随机哈希过程
byte[] bs = digest.digest(psd.getBytes());
//3,循环遍历bs,然后让其生成32位字符串,固定写法
//4,拼接字符串过程
StringBuffer stringBuffer = new StringBuffer();
for (byte b : bs) {
int i = b & 0xff;
//int类型的i需要转换成16机制字符
String hexString = Integer.toHexString(i);
if (hexString.length() < 2) {
hexString = "0" + hexString;
}
stringBuffer.append(hexString);
}
//5,打印测试
System.out.println(stringBuffer.toString());
return stringBuffer.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
}
md5加密:将字符串转换成 32位的字符串(16进制字符(0~f)) 不可逆
例如:123加密后:202cb962ac59075b964b07152d234b70
接下来直接调用加密类即可,分别在“设置密码”和“确认密码”两个对话框进行加密比对,具体代码如下:
/**
* 确认密码对话框
*/
private void showConfirmPsdDialog() {
//需要自己去定义对话框的显示样式,所以要调用dialog.setView(view);
Builder builder = new Builder(this);
final AlertDialog dialog = builder.create();
final View view = inflate(this, R.layout.dialog_confirm_psd, null);
//让对话框显示一个自己定义的对话框界面效果
dialog.setView(view);
dialog.show(); Button bt_submit = (Button) view.findViewById(R.id.bt_submit);
Button bt_cancel = (Button) view.findViewById(R.id.bt_cancel); bt_submit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
EditText et_confirm_psd = (EditText) view.findViewById(R.id.et_confirm_psd);
String confirmPsd = et_confirm_psd.getText().toString(); if (!TextUtils.isEmpty(confirmPsd)) {
//将存储在sp中32位的密码,获取出来,然后将输入的密码同样进行md5,然后与sp中存储密码比对
String psd = SpUtil.getString(getApplicationContext(), ConstantValue.MOBILE_SAFE_PSD, ""); if (psd.equals(Md5Util.encoder(confirmPsd))) {
//进入用户手机防盗模块,开启一个新的activity
Intent intent = new Intent(getApplicationContext(), testActivity.class);
startActivity(intent);
//跳转到新的界面以后需要去隐藏对话框
dialog.dismiss();
} else {
ToastUtil.show(getApplicationContext(), "输入密码错误");
} } else {
//提示用户密码输入为空的情况
ToastUtil.show(getApplicationContext(), "请输入密码");
}
}
});
bt_cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
} /**
* 设置密码对话框
*/
private void showSetPsdDialog() {
//需要自己去定义对话框的显示样式,所以要调用dialog.setView(view);
Builder builder = new Builder(this);
final AlertDialog dialog = builder.create();
final View view = inflate(this, R.layout.dialog_set_psd, null);
//让对话框显示一个自己定义的对话框界面效果
dialog.setView(view);
dialog.show(); Button bt_submit = (Button) view.findViewById(R.id.bt_submit);
Button bt_cancel = (Button) view.findViewById(R.id.bt_cancel); bt_submit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
EditText et_set_psd = (EditText) view.findViewById(R.id.et_set_psd);
EditText et_confirm_psd = (EditText) view.findViewById(R.id.et_confirm_psd);
String psd = et_set_psd.getText().toString();
String confirmPsd = et_confirm_psd.getText().toString();
if (!TextUtils.isEmpty(psd) && !TextUtils.isEmpty(confirmPsd)) {
//进入用户手机防盗模块
if (psd.equals(confirmPsd)) {
Intent intent = new Intent(getApplicationContext(), testActivity.class);
startActivity(intent);
//跳转到新的界面以后需要去隐藏对话框
dialog.dismiss();
SpUtil.putString(getApplicationContext(), ConstantValue.MOBILE_SAFE_PSD, Md5Util.encoder(psd)); } else {
ToastUtil.show(getApplicationContext(), "密码不一致");
} } else {
//提示用户密码输入为空的情况
ToastUtil.show(getApplicationContext(), "请输入密码");
}
}
});
bt_cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
}
Android 手机卫士--md5加密过程的更多相关文章
- Android 手机卫士--设置界面&功能列表界面跳转逻辑处理
在<Android 手机卫士--md5加密过程>中已经实现了加密类,这里接着实现手机防盗功能 本文地址:http://www.cnblogs.com/wuyudong/p/5941959. ...
- Android 手机卫士--参照文档编写选择器
本文来实现<Android 手机卫士--导航界面1的布局编写>中的图片选择器部分的代码. 本文地址:http://www.cnblogs.com/wuyudong/p/5944356.ht ...
- Android 手机卫士--签名文件说明&包名说明
在<Android 手机卫士--打包生成apk维护到服务器>一文中,实现了新版本的apk到服务器,当打开客户端apk的时候,发现有新版本,提示更新.还实现了利用xutils工具实现了从服务 ...
- Android 手机卫士--弹出对话框
在<Android 手机卫士--解析json与消息机制发送不同类型消息>一文中,消息机制发送不同类型的信息还没有完全实现,在出现异常的时候,应该弹出吐司提示异常,代码如下: private ...
- Android数据加密之MD5加密
前言: 项目中无论是密码的存储或者说判断文件是否是同一文件,都会用到MD5算法,今天来总结一下MD5加密算法. 什么是MD5加密? MD5英文全称“Message-Digest Algorithm 5 ...
- Android 手机卫士--确认密码对话框编写
本文接着实现“确认密码”功能,也即是用户以前设置过密码,现在只需要输入确认密码 本文地址:http://www.cnblogs.com/wuyudong/p/5940718.html,转载请注明出处. ...
- android手机卫士、3D指南针、动画精选、仿bilibli客户端、身份证银行卡识别等源码
Android精选源码 android身份证.银行卡号扫描源码 android仿bilibili客户端 android一款3D 指南针 源码 android手机卫士app源码 android提醒应用, ...
- [android] 手机卫士保存密码时进行md5加密
一般的手机没有root权限,进不去data/data目录,当手机刷机了后,拥有root权限,就可以进入data/data目录,查看我们保存的密码文件,因此我们需要对存入的密码进行MD5加密 获取Mes ...
- Android 手机卫士--安装过程中点击回退按钮
本文地址:http://www.cnblogs.com/wuyudong/p/5903707.html,转载请注明源地址. 在手机卫士之前的版本升级的对话框中: 有的用户暂时不想更新,没有点击“稍后再 ...
随机推荐
- Android探索之BroadcastReceiver具体使用以及安全性探究
前言: 最近的计划是学习一下iOS的NSNotificationCenter,突然想起来的Android的广播机制,所以还是觉得先对BroadcastReceiver来个全面的总结然后再去学习NSNo ...
- MySQL学习笔记二:权限管理
1. 创建和删除用户,mysql中的用户是由用户名和主机名来确定的 create user "user_name@host_name" identified by passwd; ...
- YII 的源码分析(二)
上一篇简单分析了一下yii的流程,从创建一个应用,到屏幕上输出结果.这一次我来一个稍复杂一点的,重点在输出上,不再是简单的一行"hello world",而是要经过view(视图) ...
- EntityFramework 7 Join Count LongCount 奇怪问题
先吐槽一下,EF7 目前来说,真对的起现在的版本命名:"EntityFramework": "7.0.0-beta1". 这篇博文纪录一下:当 Linq 查询中 ...
- ZOJ Problem Set - 1240 IBM Minus One
水题不解释,就是注意下格式,没输出一行字符串记得加一个空白行 #include <stdio.h> #include <string.h> int main() { ; ]; ...
- ZOJ Problem Set - 1048 Financial Management
我承认这是一道水的不能再水的题,今天一下就做到了,还是无耻的帖上来吧 #include <stdio.h> int main() { double sum=0; for(int i=1;i ...
- block传值和代理传值的异同点
delegate:1,“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理:2,代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始 ...
- 开源服务专题之------ssh防止暴力破解及fail2ban的使用方法
15年出现的JAVA反序列化漏洞,另一个是redis配置不当导致机器入侵.只要redis是用root启动的并且未授权的话,就可以通过set方式直接写入一个authorized_keys到系统的/roo ...
- EF配置模型
配置方法 EF里面的默认配置有两个方法,一个是用Data Annotations(在命名空间System.ComponentModel.DataAnnotations;),直接作用于类的属性上面,还有 ...
- Java字节、十进制、十六进制、字符串之间的相互转换
1. 字节转10进制 直接使用(int)类型转换. /* * 字节转10进制 */ public static int byte2Int(byte b){ int r = (int) b; retur ...