MessageDigest消息摘要
<1>MessageDigest基础
MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。
MessageDigest 对象开始被初始化。该对象通过使用 update()方法处理数据。任何时候都可以调用 reset()方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用digest() 方法之一完成哈希计算。
对于给定数量的更新数据,digest
方法只能被调用一次。在调用 digest
之后,MessageDigest 对象被重新设置成其初始状态。
1、public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException
返回实现指定摘要算法的 MessageDigest 对象。
algorithm - 所请求算法的名称
2、public static MessageDigest getInstance(String algorithm,String provider)throws NoSuchAlgorithmException,NoSuchProviderException
返回实现指定摘要算法的 MessageDigest 对象。
algorithm - 所请求算法的名称
provider - 提供者的名称。
3、public void update(byte[] input)
使用指定的 byte 数组更新摘要。
4、public byte[] digest()
通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置。
5、public static boolean isEqual(byte[] digesta, byte[] digestb)
- 比较两个摘要的相等性。做简单的字节比较。
-
注意:Provider可以通过 Java.security.
Security.getProviders()
方法获取已注册提供者列表。比较常用的有“SUN”SUN提供的常用的算法名称有:
MD2
MD5
SHA-1
SHA-256
SHA-384
SHA-512举例说明:
/** * 将一个字符串进行MD5算法,获取摘要 * @param str * @return */ public static String md5Hex(String str){ byte[] data = str.getBytes(); try { //获取指定算法的MessageDigest对象 MessageDigest digest = MessageDigest.getInstance("MD5"); //更新摘要 digest.update(data); //获取经过摘要算法后的摘要字节数组 byte[] messageDigest = digest.digest(); StringBuffer hexString = new StringBuffer(); //将经摘要算法的字节数组装换成十六进制的字符串 for(byte b : messageDigest){ String hex = Integer.toHexString(b & 0xff); if(hex.length()<2){ //长度小于2,转换时需加上一个0,构成两位格式 hexString.append(0); } hexString.append(hex); } return hexString.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; }
<二> MessageDigest高级应用
(1)MessageDigest对文件进行摘要计算
/** * 获取文件信息摘要计算 * @param in * @return * @throws IOException * @throws NoSuchAlgorithmException */ public static String fileResume(InputStream in) throws IOException, NoSuchAlgorithmException{ MessageDigest digest = MessageDigest.getInstance("MD5"); byte[] buf = new byte[1024]; int len = 0; while((len = in.read(buf))!=-1){ //每次更新缓冲中的字节摘要 digest.update(buf,0,len); } byte[] data = digest.digest(); //获取经过摘要算法后的摘要字节数组 byte[] messageDigest = digest.digest(); StringBuffer hexString = new StringBuffer(); //将经摘要算法的字节数组装换成十六进制的字符串 for(byte b : messageDigest){ String hex = Integer.toHexString(b & 0xff); if(hex.length()<2){ //长度小于2,转换时需加上一个0,构成两位格式 hexString.append(0); } hexString.append(hex); } return hexString.toString(); }
(2)第三方jar包
commons-codec 提供了便捷的MD5工具类, 可以简化消息摘要计算:
引入jar包后,直接调用
DigestUtil.DigestUtils.md5Hex(String str) 获取字符串的MD5信息摘要
DigestUtils.sha1Hex(String str) 获取字符串的SHA-1信息摘要
DigestUtils.md5Hex(InputStream in) 获取输入流的MD5信息摘要
<三>MD5原理