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) 比较两个摘要的相等性。做简单的字节比较。
SUN提供的常用的算法名称有:MD2、MD5、SHA-1、SHA-256、SHA-384、SHA-512
代码示例:
import java.security.*; import java.text.SimpleDateFormat; public class myDigest { public static void main(String[] args) { myDigest my=new myDigest(); String userid="userid"; String pwd="pwd"; private static SimpleDateFormat sdf = new SimpleDateFormat("MMddHHmmss"); String timestamp = sdf.format(Calendar.getInstance().getTime()); system.out.println("加密前:"+userid.toUpperCase() + pwd + timestamp+" 加密后:"+my.encryptPwd()); public String encryptPwd(String userid, String pwd, String timestamp) { String encryptPwd = null; try { String passwordStr = userid.toUpperCase()+ pwd + timestamp;encryptPwd = getMD5Str(passwordStr); //对密码进行加密 } catch (Exception e) { e.printStackTrace();} return encryptPwd; //返回加密字符串 } /** * @description MD5加密方法 * @param str 待加密的字符串 * @return 加密后的字符串 */ private static String getMD5Str(String str) { MessageDigest messageDigest = null; try { messageDigest = MessageDigest.getInstance("MD5"); //采用MD5算法 messageDigest.reset(); //通过reset初始化 messageDigest.update(str.getBytes("UTF-8"));//加密 } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; //初始化加密类失败,返回null } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; //初始化加密类失败,返回null } byte[] byteArray = messageDigest.digest(); //获取摘要文件 StringBuffer md5StrBuff = new StringBuffer(); //存放加密后的字符串 /*二进制转字符串*/ for (int i = 0; i < byteArray.length; i++) { if(Integer.toHexString(0xFF & byteArray[i]).length() == 1){ md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i])); } else{ md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i])); } }
return md5StrBuff.toString();
}} |