@Test public void TestMD5AndSHA() throws NoSuchAlgorithmException { String MD5=Md5("123456");//MD5加密算法 System.out.println(MD5); String SHA=SHA256("123456");//SHA256加密算法 System.out.println(SHA); //先经过MD5加密在经过SHA加密 String Md5AndSha256=SHA256(Md5("123456")); System.out.println(Md5AndSha256); } public static String Md5(String str) throws NoSuchAlgorithmException { String MD5 =""; MessageDigest md5 = MessageDigest.getInstance("MD5"); byte[] bytes = str.getBytes(); byte[] digest = md5.digest(bytes); for (int i = 0; i < digest.length; i++) { //摘要字节数组中各个字节的"十六进制"形式. int j = digest[i]; j = j & 0x000000ff; String s1 = Integer.toHexString(j); if (s1.length() == 1) { s1 = "0" + s1; } MD5 += s1; } return MD5; } public static String SHA256(String str){ MessageDigest messageDigest; String encodeStr = ""; try { messageDigest = MessageDigest.getInstance("SHA-256"); messageDigest.update(str.getBytes("UTF-8")); encodeStr = byte2Hex(messageDigest.digest()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return encodeStr; } private static String byte2Hex(byte[] bytes){ StringBuffer stringBuffer = new StringBuffer(); String temp = null; for (int i=0;i<bytes.length;i++){ temp = Integer.toHexString(bytes[i] & 0xFF); if (temp.length()==1){ stringBuffer.append("0"); } stringBuffer.append(temp); } return stringBuffer.toString(); }
总结MD5算法和SHA都是不可逆的算法,网上的破解方法都是穷举出来的,只要密码长度长一点,是不可能解出来的
MD5算法破解比较容易,加密速度比较快
SHA算法破解比较难,加密速度比较慢
一起使用虽然很保密解码几乎不可能,但是会浪费很多开销。