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,转载请注明源地址. 在手机卫士之前的版本升级的对话框中: 有的用户暂时不想更新,没有点击“稍后再 ...
随机推荐
- Rust初步(六):在C#中使用Rust组件
上一篇文章,我们通过实例比较了一下C#和Rust的性能表现,应该说在Release模式下面,Rust进行计算密集型的运算还是有些比较明显的优势的.那么,我们有没有可能,在C#中做一些快速应用开发,而一 ...
- PHPStorm如何配置,phpstorm的mac配置文件目录
PHPStorm的配置分为2大类:项目配置和IDE配置. 项目配置(设置),主要是配置具体项目.IDE 配置(设置),通用的设置会应用到所有的项目上. 项目配置每个项目的配置存储在项目所在目录的 .i ...
- 使用Free Spire.Presentation生成PowerPoint文件
使用Free Spire.Presentation生成PowerPoint文件 前言 之前有写过一篇使用Free Spire.XLS生成图表的文章,朋友圈内反应还不错,都希望我能继续写下去,把类似 ...
- 浅谈 php 采用curl 函数库获取网页 cookie 和 带着cookie去访问 网页的方法!!!!
由于近段时间帮朋友开发一个能够查询正方教务系统的微信公众平台号.有所收获.这里总结下个人经验. 开讲前,先吐槽一下新浪云服务器,一个程序里的 同一个函数 在PC测试可以正常运行,在它那里就会挂的 ...
- vmware网卡设置详解
转载请注明出处!本文连接及作者.不得用于商业用途! http://hi.baidu.com/quantumcloud/blog/item/9156a6c584996c179c163d5b.html B ...
- 【Java心得总结二】浅谈Java中的异常
作为一个面向对象编程的程序员对于 下面的一句一定非常熟悉: try { // 代码块 } catch(Exception e) { // 异常处理 } finally { // 清理工作 } 就是面向 ...
- 数据库操作提示:Specified key was too long; max key length is 767 bytes
操作重现: 法1:新建连接——>新建数据库——>右键数据库导入脚本——>提示:Specified key was too long; max key length is 767 by ...
- 从 github 上 fork repositories 后,如何和原仓库同步?
1. 首先要先确定一下是否建立了主repo的远程源: git remote -v 2. 如果里面只能看到你自己的两个源(fetch 和 push),那就需要添加主repo的源: git remote ...
- Android动画的理解
基础知识 在我们开始讲Android动画这个知识点之前,我们了解下相应的基础知识点. Shape篇 一般用Shape定义的XML文件是存放在Drawable目录下,广泛应用于在Button.TextV ...
- 4.Struts2转向类型详解
struts2中提供了多种视图转向类型,类型由type属性指定,如: dispatcher:请求转发(默认值) redirect:重定向到页面 redirectAction:重定向到Action pl ...