在之前的文章中,我们将用户的密码使用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加密过程的更多相关文章

  1. Android 手机卫士--设置界面&功能列表界面跳转逻辑处理

    在<Android 手机卫士--md5加密过程>中已经实现了加密类,这里接着实现手机防盗功能 本文地址:http://www.cnblogs.com/wuyudong/p/5941959. ...

  2. Android 手机卫士--参照文档编写选择器

    本文来实现<Android 手机卫士--导航界面1的布局编写>中的图片选择器部分的代码. 本文地址:http://www.cnblogs.com/wuyudong/p/5944356.ht ...

  3. Android 手机卫士--签名文件说明&包名说明

    在<Android 手机卫士--打包生成apk维护到服务器>一文中,实现了新版本的apk到服务器,当打开客户端apk的时候,发现有新版本,提示更新.还实现了利用xutils工具实现了从服务 ...

  4. Android 手机卫士--弹出对话框

    在<Android 手机卫士--解析json与消息机制发送不同类型消息>一文中,消息机制发送不同类型的信息还没有完全实现,在出现异常的时候,应该弹出吐司提示异常,代码如下: private ...

  5. Android数据加密之MD5加密

    前言: 项目中无论是密码的存储或者说判断文件是否是同一文件,都会用到MD5算法,今天来总结一下MD5加密算法. 什么是MD5加密? MD5英文全称“Message-Digest Algorithm 5 ...

  6. Android 手机卫士--确认密码对话框编写

    本文接着实现“确认密码”功能,也即是用户以前设置过密码,现在只需要输入确认密码 本文地址:http://www.cnblogs.com/wuyudong/p/5940718.html,转载请注明出处. ...

  7. android手机卫士、3D指南针、动画精选、仿bilibli客户端、身份证银行卡识别等源码

    Android精选源码 android身份证.银行卡号扫描源码 android仿bilibili客户端 android一款3D 指南针 源码 android手机卫士app源码 android提醒应用, ...

  8. [android] 手机卫士保存密码时进行md5加密

    一般的手机没有root权限,进不去data/data目录,当手机刷机了后,拥有root权限,就可以进入data/data目录,查看我们保存的密码文件,因此我们需要对存入的密码进行MD5加密 获取Mes ...

  9. Android 手机卫士--安装过程中点击回退按钮

    本文地址:http://www.cnblogs.com/wuyudong/p/5903707.html,转载请注明源地址. 在手机卫士之前的版本升级的对话框中: 有的用户暂时不想更新,没有点击“稍后再 ...

随机推荐

  1. Java基础之类Class使用

    大家都知道Java是一门面向对象编程语言,在Java世界里,万事万物皆对象,那个Java中怎么表示对象呢?Class 我们知道Java中的对象都是Object类的子类,那么今天我们就一起来研究一下Ja ...

  2. HttpUrlConnection发送url请求(后台springmvc)

    1.HttpURLConnection发送url请求 public class JavaRequest { private static final String BASE_URL = "h ...

  3. IOS学习之NSNotificationCenter消息机制

    NSNotificationCenter是 Cococa消息中心,统一管理单进程内不同线程的消息通迅. 添加观察者接收通知: //添加通知中心观察者 [[NSNotificationCenter de ...

  4. 实践 Neutron 前的两个准备工作 - 每天5分钟玩转 OpenStack(78)

    上一节配置了 linux-bridge mechanism driver,本节再做两个准备工作: 1. 检视初始的网络状态.2. 了解 linux bridge 环境中的各种网络设备. 初始网络状态 ...

  5. Javascript与ECMAScript

    我们经常习惯性认为Javascript就是ECMAScript,但其实不是这样的. ECMAScript是一种脚本在语法和语义上的标准. 主要包括:语法.类型.语句.关键字.保留字.操作符.对象. 它 ...

  6. ES6 - Note2:解构赋值

    ES6的解构赋值就是利用模式匹配从按照一定模式的数组或者对象中提取值赋值给变量. 1.数组的解构赋值 在ES6以前,变量的赋值是直接指定的,以后可以这么来写,如下所示 let [a,b,c] = [1 ...

  7. 精确率与召回率,RoC曲线与PR曲线

    在机器学习的算法评估中,尤其是分类算法评估中,我们经常听到精确率(precision)与召回率(recall),RoC曲线与PR曲线这些概念,那这些概念到底有什么用处呢? 首先,我们需要搞清楚几个拗口 ...

  8. 如何部署Icinga服务端

    Icinga是Nagios的一个变种,配置,使用方式几乎一样,而且完全兼容Nagios的插件.所以下面的部署方案对Nagios同样使用. 它还推出了两个中文版本,icinga-cn原版和icinga- ...

  9. JavaScript的Tab切换

    在网页设计中经常要用到tab切换,遂整理了一下常用的两种方法. 先看一下示例代码: HTML: <!doctype html> <html lang="en"&g ...

  10. EntityFramework 7 如何查看执行的 SQL 代码?

    EF 其他版本:EntityFramework 如何查看执行的 SQL 代码? 在 EF7 中,并没有 Context.Database.Log 属性访问方式,但改变更加强大了,我们可以使用下面方式配 ...