Md5加密

1、为什么要需要md5加密呢?

加密,顾名思义就是不想让自己的程序涉及到的用户信息不易被别人知道,特别是一些用户名和密码。如果使用md5加密过后就没那么容易被别人破解了,因为md5的加密是不可逆性的。但是不可逆并不代表百分之百不被破解!只是你没遇到大牛而已,当然,如果我们适当加点东西在算法里面就会大大加大破解难度的,后面我会说的哦。

2、md5加密实现步骤(只需要4小步)

①指定加密算法类型

MessageDigest digest = MessageDigest.getInstance("MD5");

其中"MD5"就是加密算法类型,务必大写否则报异常。因此这里会要求使用try/catch包围

②将需要加密的字符串转换成byte类型的数组,然后进行随机哈希过程

byte[] bs = digest.digest(psd.getBytes());

其中psd是传入的需要加密的字符串,后面有完整代码可参考,稍安勿躁哈。

psd.getBytes()表示将字符串转换为byte类型的数组, digest(psd.getBytes())表示随机哈希的过程

③ 循环遍历bs,然后让其生成32位字符串

for (byte b : bs) {
	int i=b&0xff;//固定写法,意思是取b低8位。
	//因为如果b为负数时,如果不与&0xff运算,会出错,所以每个字节都需要&0xff
	String hexString = Integer.toHexString(i);//int类型的i需要转换为16进制的字符串
if (hexString.length()<2) {//判断字符的个数是否为2位,如果是单数就在前面加0
	//确保是32位
		hexString="0"+hexString;
	}
	stringBuffer.append(hexString);
				
	}

其中的 &0xff 表示取b低8位的意思,具体解释点击去了解吧

toHexString(i)是将int类型的i 转换为16进制的两位字符串,这样就构成了32位了。但这里难免出现一位数,所以hexString.length()<2就是进行了判断,如果是一位数的就在前面加个0.使其达成32位数。

④ 拼接字符串过程

StringBuffer stringBuffer=new StringBuffer();

在第③步里面进行了拼接操作

stringBuffer.append(hexString);

拼接成的字符串就是加密成了32位的字符串了。这样就成功将简单的数字加密为32位的字符串。这样就大大加强了破解难度。

为了加强破解难度,强烈建议在字符串后面事先加入适当复杂的字符串在后面或者前面,这样就大大加强破解难度,更恶心的做法就使用递归多次调用加密方法,也就是把加密后的字符串进行多次重复加密,这样就达成了多层加密效果。

先说简单的加强加密效果的方法之一吧

encoder("123"+"itxiaolong3");

这方法是整个加密过程的方法,等会贴出来) ,传入需要加密的字符串,即密码,这里举例密码是123.但是我在后面加入了干扰字符串itxiaolong3。后面的字符串可以加复杂点,别就加abc这么简单的。越复杂越好。

好了,现在我们看看整体实现代码吧,这个是在java环境下实现的。等会也有安卓环境实现的。

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Md5Util {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		encoder("123"+"itxiaolong3");
	}

	private static void encoder(String psd) {
		// TODO Auto-generated method stub
		try {//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;//固定写法,意思是取b低8位。因为如何b为负数时,如果不与&0xff运算,会出错,所以每个字节都需要&0xff
				//int类型的i需要转换为16进制的字符
				String hexString = Integer.toHexString(i);
				//System.out.println(hexString);
				if (hexString.length()<2) {
					hexString="0"+hexString;
				}
				stringBuffer.append(hexString);
				
			}//打印看看加密后的结果
System.out.println(stringBuffer.toString());
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

安卓环境下的

package cjl.hycollege.com.a360soft.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;


public class Md5Util {

	public static String encoder(String psd) {
		try {//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;//固定写法,意思是取b低8位。因为如何b为负数时,如果不与&0xff运算,会出错,所以每个字节都需要&0xff
				//intint类型的i需要转换为16进制的字符
				String hexString = Integer.toHexString(i);
				if (hexString.length()<2) {
					hexString="0"+hexString;
				}
				stringBuffer.append(hexString);
			}
			return stringBuffer.toString();
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

}

默默说一下,此博文仅是个人学习安卓的笔记,如哪里写的有错误敬请留言指导。小龙在此谢过。