MD5 ,SHA-1使用小结

原文地址

根据原文的代码,自己做了微小的改动,添加了自己觉得比较合适的注释吧。

public class TestMD5 {
	public static void main(String[] args) {
		TestMD5 getMD5 = new TestMD5();
		System.out.println(getMD5.GetMD5Code("hgg"));
	}

	// 全局数组
	private static String[] strDigits = { "0", "1", "2", "3", "4", "5", "6",
			"7", "8", "9", "a", "b", "c", "d", "e", "f" };
	private static String[] strString = { "a", "b", "c", "d", "e", "f", "g",
			"h", "i" };

	public TestMD5() {
	}

	// 返回形式为数字跟字符串
	private static String byteToArrayString(byte bByte) {
		int iRet = bByte;
		// System.out.println("iRet="+iRet);
		if (iRet < 0) {
			iRet += 256;
		}
		int iD1 = iRet / 16;
		int iD2 = iRet % 16;
		return strDigits[iD1] + strDigits[iD2];
	}

	// 返回形式只为数字
	private static String byteToNum(byte bByte) {
		int iRet = bByte;
		// System.out.println("iRet1=" + iRet);
		if (iRet < 0) {
			iRet += 256;
		}
		return String.valueOf(iRet);
	}

	// 常见的做法
	private static String byteToString(byte bByte) {
		// 取字节中高4位/低4位转换,并将转换后的byte数值转换为 字符串
		return strDigits[bByte >>> 4 & 0xf] + "" + strDigits[bByte & 0xf];
	}

	// 转换字节数组为字串
	private static String byteToString(byte[] bByte) {
		StringBuffer sBuffer = new StringBuffer();
		for (int i = 0; i < bByte.length; i++) {
			// 结果是字符和数字
			sBuffer.append(byteToArrayString(bByte[i]));
			// 结果是数字
			// sBuffer.append(byteToNum(bByte[i]));
			// 常见做法
			// sBuffer.append(byteToString(bByte[i]));
		}
		return sBuffer.toString();
	}

	public static String GetMD5Code(String strObj) {
		String resultString = null;
		try {
			resultString = new String(strObj);
			// 取得MD5算法对象
			MessageDigest md = MessageDigest.getInstance("MD5");
			// 通过指定的byte数组对摘要进行最后更新,然后完成摘要计算
			byte[] mdist = md.digest(strObj.getBytes());
			// md.digest() 该函数返回值为存放哈希值结果的byte数组
			resultString = byteToString(mdist);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return resultString;
	}
}


其实MD5在java中的实现核心的代码也就几行,个人可以对结果根据字典进行些改变。现在,MD5的加密方式已经被破解得体无完肤了,传一个在线破解网址吧:

MD5在线破解

个人可以试试进行破解的。

注意:

1.那个常见的做法和这里的返回数字和字符窜的结果是一样的,只是表现的形式不一样,其实都是一样的。

在java中,我们知道byte类型占一个字节,就是8位。

32>>>4:表示32的2进制数值向右边位移4位,即等价为32除以2^4,结果都为2,这样高4位的值就移到低4位来了,从而取得高4位的数值。

32&0x f:表示取32的2进制数值的低4位。

2.SHA-1的做法跟MD5差不多,把获取对象实例那个改下就行了:

MessageDigest md = MessageDigest.getInstance("SHA-1");
其他的可以不改啦。

你可能感兴趣的:(MD5,sha-1)