原文地址
根据原文的代码,自己做了微小的改动,添加了自己觉得比较合适的注释吧。
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");其他的可以不改啦。