Android实例-手机安全卫士(十四)-为密码进行MD5加密
一、目标。
将设置的密码通过MD5加密后再保存。
二、代码实现。
1、在自定义工具包(com.example.mobilesafe.ui)中新增一个类(取名MD5Utils)。在新建类(MD5Utils)中新建一个返回值为String类型的public的静态方法(取名mD5Encryption),传入参数为String类型(password)。
2、在新建的方法(md5Encryption)中:
①.通过消息摘要器对象(MessageDigest)的getInstance(String algorithm)方法获取一个消息摘要器的实例对象(取名digest),参数String algorithm表示要采用的运算法则的名字。由于该过程会产生一个“无此运算法则的错误”,因此采用try...catch...模块将其捕获。为整个方法捕获,后续代码都在try中。
②.在try代码块中通过MessageDigest对象的digest(byte[] input)方法完成哈希计算并返回字节数组类型(byte[])的值(取名newpassword),在参数(byte[] input))中需要将传入的String类型对象通过getBytes()方法转成字节数组类型。
③.新建一个StringBuffer对象(取名buffer)用于储存后续每个字节进行转化后的MD5的值。
④.将得到的字节数组对象(newpassword)中的每一个字节通过for循环取出。在for循环中将每个字节和一个“八个二进制位11111111(十六进制为0xff)”进行“与运算(&),从而得到一个int类型的返回值(取名i)。
⑤.for循环中,通过整数对象(Integer)的toHexString(int i)方法将③中返回的整数值(i)转成16进制的String类型的值(取名string)。
⑥.for循环中,判断每个字节的长度是否为1。如果为1,则需在其前面用”0“补齐,通过StringBuffer对象的append(String string)方法将“0”补充至StringBuffer对象中。如果不为1则直接将String类型的值(string)通过append(String string)方法放入StringBuffer对象(buffer)中
⑦.for循环中,判断完之后再将String类型的值(string)通过append(String string)方法放入StringBuffer对象(buffer)中。
⑧.在for循环完成后将StringBuffer对象(buffer)返回,如果有异常则返回空字符串。
新建的自定义工具类MD5Utils代码如下:
1 public class MD5Utils { 2 3 public static String md5Encryption(String password) { 4 try { 5 MessageDigest digest = MessageDigest.getInstance("md5"); 6 byte[] newpassword = digest.digest(password.getBytes()); 7 StringBuffer buffer = new StringBuffer(); 8 for(byte b :newpassword){ 9 int i = b & 0xff; 10 String string = Integer.toHexString(i); 11 if(string.length() ==1){ 12 buffer.append("0"); 13 } 14 buffer.append(string); 15 } 16 return buffer.toString(); 17 } catch (NoSuchAlgorithmException e) { 18 e.printStackTrace(); 19 return ""; 20 } 21 } 22 }
3、修改设置防盗密码和输入防盗密码对话框中的密码的保存方式。在主界面代码中:
①.在自定义设置密码对话框(showSetPwdDialog)中,在判断设置密码和确认设置密码相等时,将Editor对象(editor)的putString((String key, String value)方法中的value改为通过新建类(MD5Utils)中的新建方法(md5Encryption)处理后的值,代码为:
1 editor.putString("password", MD5Utils.md5Encryption(password));
①.在输入密码对话框(showinputPwdDialog)中,在判断输入密码和已保存的密码相等时,需要先将输入的密码通过新建类(MD5Utils)中的新建方法(md5Encryption)处理后再与已经保存好的密码进行比较。
代码如下;
1 else if (MD5Utils.md5Encryption(inputpassword).equals(savedpassword))
三、拓展。
可以对MD5加密后数组再进行多次的MD5加密算法,以提高其安全性!