java MD5 散列算法计算

java 散列算法,主要是通过MessageDigest 对象来实现,因此MD 和 SHA 系列可以共用一套代码

java 散列算法实现:依靠java 类库,(md5实现依据rfc1321 规范)

java 加密类库实现,一般是在security 包下,有两个security包
rt.jar 下的java/security
rt.jar 下的sun/security

1.首先是一个MessageDigest 信息摘要类,获得一个摘要对象,MessgaeDigest.getInstance("MD5");
//根据传入的 散列算法的名称获得一个digest实例,如:MD5,SHA-1,SHA-224等等...    要想知道具体支持哪些散列算法,可以去 rt.jar 下的sun/security/provider 包查看实体类支持

2.将要加密的字符串的字节数组传入digest对象,digest.update(byte b [])    方法
//java 注释:更新摘要信息,这里注意,将文本字符串转成字节数组的时候,编码是可选的,如:UTF-8,GBK,或是默认的ISO-8859-1

3.digest.digest()方法,实现最后的加密运算,返回加密后的字节数组
//digest.digest() 方法,抽象,最后,根据java 的继承extends 和实现体系,找到具体的provider    去实现信息摘要

4.最后算法输出长串字符,实际是将加密后的返回的摘要字节数组,逐个字节转成16进制,最后拼接成一个字符串;具体实现方法:Integer.toHexString(i);

package com.hash.sha;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 散列算法
 * sha-1 类似md5
 * @author zcm
 *
 */
//MAC算法主要集合了MD和SHA两大系列消息摘要算法。MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种算法;
//SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384.HmacSHA512五种算法。
public class TestSHA {
	
	//SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512
	public static final String enType_md2 = "MD2";
	public static final String enType_md5 = "MD5";
	public static final String enType_sha1 = "SHA-1";
	public static final String enType_sha224 = "SHA-224";
	public static final String enType_sha256 = "SHA-256";
	public static final String enType_sha384 = "SHA-384";
	public static final String enType_sha512 = "SHA-512";
	
	public static void main(String[] args) throws UnsupportedEncodingException {
		//System.out.println(sign("test","UTF-8",enType_md2));
		System.out.println(sign("f","UTF-8",enType_sha1));
		//098f6bcd4621d373cade4e832627b4f6
		//098F6BCD4621D373CADE4E832627B4F6
	}
	
	

	/**
	 * 散列算法加密
	 * 
	 * @param content		字符内容
	 * @param inputCharset	字符集
	 * @param enType	加密类型
	 * @return
	 */
	public static String sign(String content, String inputCharset,String enType) {
		// 获取信息摘要 - 参数字典排序后字符串
		try {
			// 指定sha1算法
			MessageDigest digest = MessageDigest.getInstance(enType);//sun.security.provider.SHA@74c6fd6e //sun.security.provider.MD2@4e2c390c
			digest.update(content.getBytes(inputCharset));
			// 获取字节数组
			byte messageDigest[] = digest.digest();
			// Create Hex String
			StringBuffer hexString = new StringBuffer();
			// 字节数组转换为 十六进制 数
			for (int i = 0; i < messageDigest.length; i++) {
				String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
				if (shaHex.length() < 2) {
					hexString.append(0);
				}
				hexString.append(shaHex);
			}
			return hexString.toString().toUpperCase();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return null;
	}

}

猜你喜欢

转载自blog.csdn.net/kzcming/article/details/81585342