所谓MD5,即"Message-Digest Algorithm 5(信息-摘要算法)",它由MD2、MD3、MD4发展而来的一种单向函数算法(也就是HASH算法),它是国际著名的公钥加密算法标准RSA的第一设计者R.Rivest于上个世纪90年代初开发出来的。MD5的最大作用在于,将不同格式的大容量文件信息在用数字签名软件来签署私人密钥前"压缩"成一种保密的格式,关键之处在于——这种"压缩"是不可逆的。
MD5还被用于加密解密技术上,如Unix、各类BSD系统登录密码(在MD5诞生前采用的是DES加密算法,后因MD5安全性更高,DES被淘汰)、通信信息加密(如大家熟悉的即时通信软件MyIM)、数字签名等诸多方面。
MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。
Md5 加密类
public class MD5Builder { static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; public static String getMD5(File file) { FileInputStream fis = null; try { MessageDigest md = MessageDigest.getInstance("MD5"); // logger.info("MD5摘要长度" + md.getDigestLength()); fis = new FileInputStream(file); byte[] buffer = new byte[2048]; int length = -1; long s = System.currentTimeMillis(); while ((length = fis.read(buffer)) != -1) { md.update(buffer, 0, length); } byte[] b = md.digest(); return byteToHexString(b); } catch (Exception ex) { ex.printStackTrace(); return null; }finally { try { fis.close(); } catch (IOException ex) { ex.printStackTrace(); } } } /** *//** * 一般的用法: 在注册时 调用 getMD5() 代码:MD5Builder.getMD5( password) * * 登录时 MD5Builder.getMD5( password) 与数据库中的相比较 */ public static String getMD5(String message){ try { // 生成一个MD5加密计算摘要 MessageDigest md = MessageDigest.getInstance("MD5"); // digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符 byte[] b = md.digest(message.getBytes("utf-8")); return byteToHexString(b); } catch (Exception e) { // logger.error(e); e.printStackTrace(); return null; } } private static String byteToHexString(byte[] tmp) { String s; char str[] = new char[16 * 2]; int k = 0; for (int i = 0; i < 16; i++) { byte byte0 = tmp[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } s = new String(str); return s; } }