commons-codec包可以从apache下载:
MD5现在是用来作为一种数字签名,即A向B发送数据m,为了让B确信数据是A送来的并且没有被篡改于是A就是用hash算法将数据散列一并发送给 B。B接收到文件以后也用相同的hash算法校验数据是否被修改。主要是防止数据被修改的。MD5值的重复就是所谓的碰撞。
获取文件的MD5码:
System.out.println(DigestUtils.md5Hex(new FileInputStream(new File("C:/ttt/new1328505655521"))));
获取字符串MD5码:
System.out.println(DigestUtils.md5Hex(string));
22222222222222222222
今天在这个问题上花费了一部分时间,起初,自己借别人的类,在项目中采用应用md5校验文件发现和在linux下采用命令md5sum校验文件结果不一致。
这个问题,太惊奇了!
最后直接下结果吧:
import java.io.ByteArrayOutputStream;
import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class TestMD5 { public static String md5( byte[] key) { String cacheKey;try { final MessageDigest mDigest = MessageDigest.getInstance("MD5");mDigest.update(key);cacheKey = bytesToHexString(mDigest.digest());} catch (NoSuchAlgorithmException e) { cacheKey = String.valueOf(key.hashCode());}return cacheKey;}private static String bytesToHexString(byte[] bytes) { StringBuilder sb = new StringBuilder();for (int i = 0; i < bytes.length; i++) { String hex = Integer.toHexString(0xFF & bytes[i]);if (hex.length() == 1) { sb.append('0');}sb.append(hex);}return sb.toString();} private static byte[] getBytes(String filePath){ byte[] buffer = null; try { File file = new File(filePath); FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream bos = new ByteArrayOutputStream(1000); byte[] b = new byte[1000]; int n; while ((n = fis.read(b)) != -1) { bos.write(b, 0, n); } fis.close(); bos.close(); buffer = bos.toByteArray(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return buffer; }/*** @param args*/public static void main(String[] args) { // TODO Auto-generated method stub String path = "D:\\Android\\Test.apk"; String md5Value = md5(getBytes(path)); System.out.println("md5Value =====" + md5Value); }}
Linux上验证后,发现结果一致了,先简单记录下,后面在详细深入研究,并下文档记录。
3333333333333333333333333
MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改。MD5全称是报文摘要算法(Message-Digest Algorithm
5),此算法对任意长度的信息逐位进行计算,产生一个二进制长度为128位(十六进制长度就是32位)的“指纹”(或称“报文摘要”),不同的文件产生相同的报文摘要的可能性是非常非常之小的。 在linux或Unix上,md5sum是用来计算和校验文件报文摘要的工具程序。一般来说,安装了Linux后,就会有md5sum这个工具,直接在命令行终端直接运行。使用md5sum来产生指纹(报文摘要)命令如下: md5sum file > file.md5或者 md5sum file >>file.md5 也可以把多个文件的报文摘要输出到一个md5文件中,这要使用通配符*,比如某目录下有几个iso文件,要把这几个iso文件的摘要输出到iso.md5文件中,命令如下: md5sum *.iso > iso.md52、使用md5报文摘要验证文件,方法有二: 把的文件file和该文件的file.md5报文摘要文件放在同一个目录下,然后用如下命令进行验证: md5sum -c file.md5然后如果验证成功,则会输出:正确 md5sum passwd passwd.bak /etc/passwd--------------------------------------
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class MD5Utils {
/*
* 传入一个字符串String msg,返回Java MD5加密后的16进制的字符串结果。 * 结果形如:c0e84e870874dd37ed0d164c7986f03a */ public static String getMD5(String msg) { MessageDigest md = null; try { md = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } md.reset(); md.update(msg.getBytes()); byte[] bytes = md.digest();String result = "";
for (byte b : bytes) { // byte转换成16进制 result += String.format("%02x", b); }return result;
}// 测试
// public static void main(String[] args) { // String msg = "hello,world!"; // System.out.println(getMD5(msg)); // }}------------------------------
444444444444444444444
import java.security.MessageDigest;/** * Md5 工具 */public class Md5Util { private static MessageDigest md5 = null; static { try { md5 = MessageDigest.getInstance("MD5"); } catch (Exception e) { System.out.println(e.getMessage()); } } /** * 用于获取一个String的md5值 * @param string * @return */ public static String getMd5(String str) { byte[] bs = md5.digest(str.getBytes()); StringBuilder sb = new StringBuilder(40); for(byte x:bs) { if((x & 0xff)>>4 == 0) { sb.append("0").append(Integer.toHexString(x & 0xff)); } else { sb.append(Integer.toHexString(x & 0xff)); } } return sb.toString(); } public static void main(String[] args) { System.out.println(getMd5("hello world")); }}