I have tried to use java.security.MessageDigest or org.apache.commons.codec.digest.DigestUtils to do md5, but there comes out different results.
The sample code as below:
public static void main( String[] args ) { System.out.println("MessageDigest: " + MD5("12345") ); MessageDigest md5Digest = DigestUtils.getMd5Digest(); System.out.println("MD5Hex with digest: " + DigestUtils.md5Hex(md5Digest.digest("12345".getBytes()))); System.out.println("MD5Hex: " + DigestUtils.md5Hex("12345")); } public final static String MD5(String s) { char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; try { byte[] btInput = s.getBytes(); // 獲得MD5摘要算法的 MessageDigest 對象 MessageDigest mdInst = MessageDigest.getInstance("MD5"); // 使用指定的字節更新摘要 mdInst.update(btInput); // 獲得密文 byte[] md = mdInst.digest(); // 把密文轉換成十六進制的字符串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } System.out.println(); return new String(str); } catch (Exception e) { e.printStackTrace(); return null; } }
The results as below:
MessageDigest: 827CCB0EEA8A706C4C34A16891F84E7B MD5Hex with digest: aad43635bbd353cef6ea6546093fa0c7 MD5Hex: 827ccb0eea8a706c4c34a16891f84e7b
If I have give md5Digest.digest() into DigestUtils.md5Hex, the result is different from MessageDigest. But if I just do md5Hex(), it will be the same. What’s the different between this two way?
Thanks
Advertisement
Answer
When you are calling DigestUtils.md5Hex(md5Digest.digest("12345".getBytes())))
, you actually calculate the MD5 of the result of the previous MD5 calculation. Thus no wonder that double-MD5 differs from single MD5.